MongoDB使用来自一个Collection的id数组根据来自另一个Collection的id过滤结果



假设有一个MongoDB CollectionCollA。假设CollA有以下三个文档:

{"_id": "1", "name": "Bob"},
{"_id": "2", "name": "John"},
{"_id": "3", "name": "Will"}

假设有另一个MongoDB CollectionCollB,它具有以下文档:

{
"_id": "1", 
"foo": {
"arr": ["1", "3"]
}
}

在MongoDB中是否有方法查询foo.arr数组内容(["1"],["3"])的CollB,并使用它来检索CollA中具有这些_id值的文档,以产生以下结果:

{"_id": "1", "name": "Bob"},
{"_id": "3", "name": "Will"}

CollB执行一个简单的$lookup。在$unwind之后使用$replaceRoot$lookup的结果

db.CollB.aggregate([
{
"$lookup": {
"from": "CollA",
"localField": "foo.arr",
"foreignField": "_id",
"as": "collALookup"
}
},
{
"$unwind": "$collALookup"
},
{
"$replaceRoot": {
"newRoot": "$collALookup"
}
}
])

这是Mongo Playground供您参考。

查询
  • 查找_id字段与数组foo.arr和限制1,我们只关心是否连接(不需要保存很多文件到内存)
  • 保留加入的文件(非空结果)
  • 取消设置结果字段

*这将保持collA的所有文档,它们的_id,在collB的任何数组中(如果你只想要collB的一个特定文档,我认为从collB开始,像ray的答案更有意义,但在collB的1个成员的$lookup之前添加一个$match)

Playmongo

collA.aggregate(
[{"$lookup": 
{"from": "collB",
"localField": "_id",
"foreignField": "foo.arr",
"pipeline": [{"$limit": 1}],
"as": "results"}},
{"$match": {"$expr": {"$ne": ["$results", []]}}},
{"$unset": ["results"]}])

最新更新