假设有一个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"]}])