node.js mongoose删除不在这些文档的当前列表中的预先存在的文档的子集

时间:2017-04-15 20:28:10

标签: node.js mongodb mongoose

我有一个从Web API检索的文档列表。此列表中的所有文档具有相同的结构,并且组合的2个字段创建自然键。

我把这个列表留在一个集合中。

一个月后,我将根据来自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" }
]

2 个答案:

答案 0 :(得分:1)

如果您有一组文档想要用来替换现有集合中的所有文档,那么最好和最安全的方法是使用临时集合。

以下步骤假设您的集合名为foo

  1. 将新文档插入名为foo_temp

  2. 的临时集合中
  3. 添加完所有记录后(在回调或当时)将原始foo集合重命名为foo_old

  4. foo_temp集合重命名为foo

  5. 删除集合foo_old

  6. 注意:

    • 在MongoDB中,将自动添加新集合。
    • 性能不应该是一个问题,因为您只处理1K记录左右。尽管如此,一夜之间也不会受到伤害。
    • 在问题中,注意到ID是专门设置的而不是自动生成的,如果它们是自动生成的,则新ID与旧的ID不匹配。

    参考文献:

    Inserting multiple documents

    Renaming a collection

    Dropping a collection

答案 1 :(得分:0)

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

在LINQ中,这很容易。这可以吗?

我不知道如何在mongoose中做到这一点,而不是在一侧或另一侧和/或没有LINQ迭代。