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

  1. 将新文档插入到名为foo_temp的临时集合中

  2. 一旦添加了所有logging(在callback中或者之后),将原始foo集合重命名为foo_old

  3. foo_temp集合重命名为foo

  4. 删除集合foo_old

笔记:

  • 在MongoDB中,新的集合将被自动添加。
  • 性能不应该是一个问题,因为你只处理1Klogging左右。 不过,一夜之间也不会有什么坏处。
  • 在这个问题中,注意到这些ID是专门设置的,而不是自动生成的,如果它们是自动生成的,新的将不能匹配旧的。

参考文献:

插入多个文件

重命名一个集合

丢弃一个集合

正如你所说,你可以迭代旧文档的一个子集。 将其中的每一个匹配到自然键上的较新文档列表。 当您find不在较新列表中的旧文档时,请将其删除。

在LINQ中,这很容易。 这对你有用吗?

我不知道如何在没有迭代的情况下使用mongoose,或者不使用LINQ。