mongodb 使用聚合管道的只有父树和一级子树的Mongo查询

wpcxdonn  于 2023-03-17  发布在  Go
关注(0)|答案(2)|浏览(103)

假设我有一个集合things,其中包含以下文档:

[
  {
    "_id": 1,
    "name": "one",
    "others": [2, 3]
  },
  {
    "_id": 2,
    "name": "two"
  },
  {
    "_id": 3,
    "name": "three"
  },
  {
    "_id": 4,
    "name": "four"
  }
]

如您所见,第一个文档通过其others数组形成了一棵树,该数组包含作为第一个文档的子文档的其他文档的id。
我尝试编写一个查询,返回一个文档的平面列表,其中第一个文档是父文档,其余文档的id在第一个文档的others数组中。我只需要直接子元素。对于本例,传递值1的查询的结果数组将为

[
  {
    "_id": 1,
    "name": "one",
    "others": [2, 3]
  },
  {
    "_id": 2,
    "name": "two"
  },
  {
    "_id": 3,
    "name": "three"
  }
]

看起来很简单,但我不确定语法。
我试过了

db.things.aggregate([{
  $match: { _id: 1 }
}, {
  $match: { _id: { $in: '$others'}}
}
])

这将失败,并显示消息$in needs an array,当然,它确实失败了。要获取第一个元素是父元素、其他元素是第一级子元素的文档列表,正确的语法是什么?

bnlyeluc

bnlyeluc1#

一种方法是执行自查找,然后$unionWith根记录(id:(一)

db.collection.aggregate([
  {
    "$match": {
      "_id": 1
    }
  },
  {
    "$lookup": {
      "from": "collection",
      "localField": "others",
      "foreignField": "_id",
      "as": "othersLookup"
    }
  },
  {
    "$unwind": "$othersLookup"
  },
  {
    "$replaceRoot": {
      "newRoot": "$othersLookup"
    }
  },
  {
    "$unionWith": {
      "coll": "collection",
      "pipeline": [
        {
          "$match": {
            "_id": 1
          }
        }
      ]
    }
  }
])

Mongo Playground

pkmbmrz7

pkmbmrz72#

当我将集合名称改为things并重新排序后,这个方法运行得很好。谢谢,@ray!下面是我的最后一个查询:

db.things.aggregate([
  {
    "$match": {
      "_id": 1
    }
  },
  {
    "$unionWith": {
      "coll": "things",
      "pipeline": [
        {
          "$match": {
            "_id": 1
          }
        },
        {
          "$lookup": {
            "from": "things",
            "localField": "others",
            "foreignField": "_id",
            "as": "othersLookup"
          }
        },
        {
          "$unwind": "$othersLookup"
        },
        {
          "$replaceRoot": {
            "newRoot": "$othersLookup"
          }
        }
      ]
    }
  }
])

结果:

[
  {
    "_id": 1,
    "name": "one",
    "others": [2, 3]
  },
  {
    "_id": 2,
    "name": "two",
    "others": [5]
  },
  {
    "_id": 3,
    "name": "three"
  }
]

相关问题