我试图找出匹配MongoDb集合的最佳方法,以在这两个集合中查找不存在的文档。
想象一下,我们有原始的MongoDb集合和应用程序数据。
db.Coll1
{'_id': 'someValue', ... 'externalKey':'1'}
{'_id': 'someValue', ... 'externalKey':'2'}
{'_id': 'someValue', ... 'externalKey':'3'}
其中“ externalKey”始终包含值并且是唯一的。
现在,它已被具有相同格式但新数据的文档替换为另一个集合。
Coll2
{'_id': 'someValue', ... 'externalKey':'1'}
{'_id': 'someValue', ... 'externalKey':'2'}
{'_id': 'someValue', ... 'externalKey':'4'}
假设在为要查找(和处理)的业务目的覆盖Coll2 => Coll1之前:
要删除的文档(在Coll1中为文档{'_id': 'someValue', ... 'externalKey':'3'}
将要添加的文档(在Coll2中为{'_id': 'someValue', ... 'externalKey':'4'}
即我们匹配的是Col1 => Coll2(删除)和Col2 => Col1(添加)。
与sql概念相比,它更像是两个键均为null的完全外部联接。
SELECT * FROM COLL1 C1
FULL OUTER JOIN COLL2 C2
WHERE C1.ExternalKey IS NULL
AND C2.ExternalKey IS NULL
执行此操作最快的方法是什么? 我的意思是$ lookup,自定义代码(例如,通过mongoDb驱动程序的控制台应用程序)或map reduce?
比方说,更新的记录不在范围内,不需要重新处理。 MongoDb的版本无关紧要。 优选3.6。 可能是4.x
答案 0 :(得分:0)
最快的方法是按照某些条件(最好是ID)对数据进行排序,然后比较每个集合中的元素。例如,
Collection 1 IDs are:
1, 2, 3, 5 , 6, 7, 10
Collection 2 IDs are:
1, 2 3, 4, 5, 6, 8, 9, 10
现在,您保留2个索引i = 0和j = 0,每个集合一个
If collection1[i] == collection2[j] then i++ and j++
从上面的示例中,当i = 3和j = 3时,值不相等
if(collection1[i] > collection2[j]) then add collection2[j] to the adding collection and increase j
在示例4中将添加到添加列表
if(collection1[i] < collection2[j]) then add collection1[i] to the removal list and increase i
当i = 5且j = 6时,集合2中缺少7,因此应将其删除
Then repeat the above steps
如果您有巨大的数据库(如TB),则需要使用游标并从每个集合中读取每个页面,然后进行上面的比较。您可以编写mongoshell脚本