我有一个从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" }
]
答案 0 :(得分:1)
如果您有一组文档想要用来替换现有集合中的所有文档,那么最好和最安全的方法是使用临时集合。
以下步骤假设您的集合名为foo
将新文档插入名为foo_temp
添加完所有记录后(在回调或当时)将原始foo
集合重命名为foo_old
将foo_temp
集合重命名为foo
删除集合foo_old
注意:
参考文献:
答案 1 :(得分:0)
正如您所说,可以迭代旧文档的子集。将其中的每一个与自然键上的较新文档列表相匹配。当您发现较旧的文档不在较新的列表中时,请将其删除。
在LINQ中,这很容易。这可以吗?
我不知道如何在mongoose中做到这一点,而不是在一侧或另一侧和/或没有LINQ迭代。