如何在MongoDb

时间:2017-10-26 19:31:29

标签: mongodb match lookup

我有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
}
}

这怎么可能?

谢谢!

1 个答案:

答案 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}
  }
 ]);