node.js mongoose删除不在当前这些文档列表中的预处理文档的子集
我有一个从Web API检索的文档列表。 该列表中的所有文档具有相同的结构,并且两个字段相结合创build了一个自然键。
我拿这个名单,坚持收集。
一个月后,我将根据2个字段之一的特定值从API调用新的文档子集。 但是,并非新子集中的所有文档都包含之前保留的所有文档。
我需要识别并删除不在新子集中的旧文档。
在SQL中是这样的:
delete a from olderset a left join newersubset b on a.f1 = b.f1 and a.f2 = b.f2 where a.f2 is null -- or something like that
将f1视为companyName,将f2视为transactionID。 olderset
将包含不同companyName / s的集合。
但是我的新API调用只能获取某个特定公司的交易。
在mongoose中,从olderset
集合中删除公司特定的旧事务的最佳策略是什么? 当要删除的文件不存在于newersubset
列表中时?
你能提供一个代码示例吗?
样本数据:
[ { "f1": "f1a", "f2": "f2a", "f3": "f3a" } , { "f1": "f1b", "f2": "f2b", "f3": "f3b" } , { "f1": "f1c", "f2": "f2c", "f3": "f3c" } , { "f1": "f1d", "f2": "f2d", "f3": "f3d" } ]
第二轮:
[ { "f1": "f1a", "f2": "f2a", "f3": "f3a" } , { "f1": "f1b", "f2": "f2b", "f3": "f3b" } , { "f1": "f1c", "f2": "f2c", "f3": "f3c" } ]
如果您有一组文档要replace现有集合中的所有文档,则最好和最安全的方法是使用临时集合。
以下步骤假设您的集合称为foo
-
将新文档插入到名为
foo_temp
的临时集合中 -
一旦添加了所有logging(在callback中或者之后),将原始
foo
集合重命名为foo_old
-
将
foo_temp
集合重命名为foo
-
删除集合
foo_old
笔记:
- 在MongoDB中,新的集合将被自动添加。
- 性能不应该是一个问题,因为你只处理1Klogging左右。 不过,一夜之间也不会有什么坏处。
- 在这个问题中,注意到这些ID是专门设置的,而不是自动生成的,如果它们是自动生成的,新的将不能匹配旧的。
参考文献:
插入多个文件
重命名一个集合
丢弃一个集合
正如你所说,你可以迭代旧文档的一个子集。 将其中的每一个匹配到自然键上的较新文档列表。 当您find不在较新列表中的旧文档时,请将其删除。
在LINQ中,这很容易。 这对你有用吗?
我不知道如何在没有迭代的情况下使用mongoose,或者不使用LINQ。