Mongodb $(美元符号)数组的项目查询

zwghvu4y  于 2022-11-28  发布在  Go
关注(0)|答案(1)|浏览(128)

我有以下数据:

{
_id: "1"
transitions: [
    {
       "_id" : "11"
      "name" : "Tr1"
      "checkLists" : [
                           { _id: "111", name: "N1"},
                           { _id: "112", name: "N2"}
                           ]
     }  
  ]
}

我使用下面的代码通过查询_id:112获得名称N2

db.collection.findOne({ 'transitions.checkLists._id: new ObjectId("112") } }}, {  'transitions.checkLists.$': 1 })

但是结果返回了它们两个:

{ _id: ObjectId("1"),
  transitions: 
   [ { checkLists: 
        [ { name: 'N1', _id: ObjectId("111") },
          { name: 'N2', _id: ObjectId("112") } ] } ] }

我想通过查询_id:112查找并仅获取名称N2预期结果:

{ _id: ObjectId("1"),
  transitions: 
   [ { checkLists: 
        [ { name: 'N2', _id: ObjectId("112") } ] } ] }
s3fp2yjn

s3fp2yjn1#

您可以通过聚合框架执行此操作,如下所示:

db.collection.aggregate([
{
 $match: {
  "transitions.checkLists._id": "111"
  }
},
{
"$addFields": {
  "transitions": {
    "$map": {
      "input": "$transitions",
      "as": "t",
      "in": {
        "$mergeObjects": [
          "$$t",
          {
            "checkLists": {
              "$filter": {
                "input": "$$t.checkLists",
                "as": "c",
                "cond": {
                  $eq: [
                    "$$c._id",
                    "111"
                  ]
                }
              }
            }
          }
        ]
      }
    }
   }
  }
 },
 {
  "$addFields": {
    transitions: {
     $filter: {
      input: "$transitions",
      as: "elem",
      cond: {
        "$ne": [
          "$$elem.checkLists",
          []
        ]
      }
    }
  }
 }
}

])

解释道:
1.匹配第一阶段中的transitions.checkLists._id元素。
1.Map/合并对象与筛选的检查列表,以便仅从transitions.checkLists数组中筛选所需的对象。
1.删除不存在checkList的transitions元素。(需要执行此操作才能删除不存在matching _id的同一文档的元素)
Playground

相关问题