如何删除不在集合中的所有文档?

How do I delete all documents not in a collection?

我刚开始使用 pouchdb,运行 遇到了问题。

我有一组文档,来自 pouchdb 数据库以外的来源。他们有 _id,但没有 _rev。

我想做的是:

  1. 集合中存在但数据库中不存在的任何文档都应添加到数据库中
  2. 任何存在于集合中并且确实存在于数据库中的文档都应该将它们在数据库中的值更新为集合中文档的值
  3. 数据库中存在但集合中不存在的任何文档都应从数据库中删除。

前两个的明显处理是遍历集合并为每个文档确定它是否存在于数据库中,如果存在,则设置 _rev。然后放文件。

第三个 "obvious" 处理是查找数据库中没有 _id 与集合中任何 _id 匹配的每个文档。

但我不确定该怎么做。我要找的是 "NOT IN" 之类的东西,但我没找到。

有什么想法吗?

一种方法是使用筛选器复制到另一个数据库,筛选出您想要的所有内容,同时不筛选出您不需要的任何内容。

一旦您确认既没有不需要的也没有丢失的项目,您可以删除原始数据库并重新复制回来。

这似乎对我有用。诀窍是使用“$nin”运算符。

改进建议?

const replaceAllFoos = async (foos: [Foo]) => {

    foos.forEach(foo => {
        foo._id = buildId(foo);
        foo.collectiontype = "foo";
    });

    const ids = foos.map(foo => foo._id);

    await getDb(async db => {
        for await (const foo of foos) {
            try {
                const existing = await db.get(foo._id!);
                foo._rev = existing._rev;
            } catch (err) {
                if (err.status !== 404) {
                    throw err;
                }
            }

            await db.put(foo);
        }

        let extras = await db.find({
            selector: {
                "$and": [
                    {"collectiontype": {"$eq": "foo" }},
                    {"_id": {"$nin": ids}}
                ]
            }
        });

        for await (const extra of extras.docs) {
            await db.remove(extra)
        }
    });
}