编写MongoDB查询以基于引用的属性进行过滤?

时间:2018-10-05 16:05:38

标签: python python-3.x mongodb aggregation-framework pymongo

比方说,我有一组称为“狗”的文档,一组称为“所有者”的文档以及每个狗文档中对所有者的引用。

例如:

dog1:
{"_id": "abcdef0123456789",
 "name": "Rover",
 "owner": ObjectId("1234567890abcdef")}

owner1:
{"_id": "1234567890abcdef",
 "name": "Bob"}

因此,以该示例为例,我将如何查找所有所有者名为“鲍勃”的狗。

这是一个现有的数据库,因此我无法更改其存储数据的方式。我坚持使用当前的格式。

1 个答案:

答案 0 :(得分:1)

您可以在mongodb 3.6 及更高版本中的$lookup聚合以下尝试

db.owner.aggregate([
  { "$match": { "name": "Bob" }},
  { "$lookup": {
    "from": "dogs",
    "let": { "ownerId": "$_id" },
    "pipeline": [{ "$match": { "$expr": { "$eq": ["$owner", "$$ownerId"] }}}],
    "as": "dogs"
  }}
])

或具有 3.4 $lookup及更高版本

db.owner.aggregate([
  { "$match": { "name": "Bob" }},
  { "$lookup": {
    "from": "dogs",
    "localField": "_id",
    "foreignField": "owner",
    "as": "dogs"
  }}
])