想象一下,我收集了集合A中的以下文档:
{
"_id" : 1,
"ratio" : 6.0
}
我还收集了B集合中的以下文件:
[
{
"_id" : 1,
ratio : 3.0
},
{
"_id" : 2,
ratio : 4.0
}
]
如何合并它们以产生以下输出:
[
{
"_id" : 1,
ratio : 6.0
},
{
"_id" : 2,
ratio : 4.0
}
]
所以,正如你在上面看到的那样:
当collectionA._id
与collectionB._id
匹配时,会产生collectionA
的比率,
当ids不匹配时,它采用collectionB
的比率。
collectionA
不会包含collectionB
中不存在的ID,因为我在先前的聚合中从collectionB
派生collectionA
。
例如,如果collectionB
中有更多ID,则它们也会添加到输出中。
因此,基本上,collectionA
会覆盖collectionB
,然后collectionB
中不匹配的文档也会添加到结果中。
这在我的应用程序代码中实现是微不足道的,但是我的数据库中存在数百万条记录,所以我想在MongoDB中执行此操作。我也知道there is no full-outer-join in MongoDB,有没有办法实现这个结果?
答案 0 :(得分:0)
所以,基本上,collectionA会覆盖collectionB,然后是 来自collectionB的不匹配文档也会添加到结果中。
您只能与MongoDB进行左连接,因此在查询collectionA时,无法从collectionB中选择与collectionA中的任何文档都不匹配的文档。因此,您应该在两个查询中执行此操作。第一个只是从collectionA中选择文档(这些文档无论如何都会覆盖collectionB中的文档,所以我们对collectionB中与collectionA中的文档匹配的文档不感兴趣。)
第二个查询 - 从collectionB获取与collectionA中的任何文档不匹配的文档:
db.collectionB.aggregate([
{
$lookup: {
from: "collectionA",
localField: "_id",
foreignField: "_id",
as: "docs"
}
},
{ $match: { docs: {$eq: [] } } },
{ $project: { docs: 0 } }
])