我有2个集合,如:
collectionA: { _id:" id1", ...道具。 }
collectionB: { _id:" id2", collectionA_id:" id1", property_x:3, ...道具。 }
当我加入查询时,我如何通过collectionB.property_x过滤?
所以我想尝试:
{
"$lookup": {
"from" => "",
'localField' => '_id',
'foreignField' => 'job_id',
'as' => 'collB'
},
"$match": {
"collB.property_x": 3
}
}
这怎么可能?
谢谢!
答案 0 :(得分:2)
有可能。想象一下,你有两个这样的集合:
db.collectionA.insert({_id: 1, field: "hey"});
db.collectionA.insert({_id: 2, field: "hey2"});
db.collectionA.insert({_id: 3, field: "hey3"});
db.collectionB.insert({_id:1, fk: 1, cnt: 4});
db.collectionB.insert({_id:2, fk: 2, cnt: 0});
假设fk字段代表某种“外键”关系。我们希望使用 $ lookup 将来自collectionB的文档嵌入到collectionA中。查找非常灵活,因此它将依赖文档作为数组嵌入,因为可以存在一对多的关系。我们要做的是 $ unwind 这个嵌套数组在每个文档中只有一个来自collectionB的嵌入项,然后我们可以对这些条目执行 $ match 。所以我的整个查询看起来像这样:
db.collectionA.aggregate([
{
$lookup:
{
from: "collectionB",
localField: "_id",
foreignField: "fk",
as: "relation"
}
},
{
$unwind: "$relation"
},
{
$match: {"relation.cnt": 0}
}
]);