Mongodb 嵌套文档的 $ 运算符

Mongodb $ operator for nested documents

有wfs合集如下:

{
_id:'1',
transitions:
  [
    {
     _id:'11',
     checkLists:
       [
        {
         _id:'111',
         name:'One',
        },
        {
         _id:'112',
         name:'Two',
        }
       ]
     }
  ]
}

我要获取_id:'111'的子子文档 我尝试了以下代码但没有按预期工作,它 returns 所有二级嵌套文档都不是正确的对象

db.wfs.findOne(
    { 'transitions.checkLists._id':  ObjectId('111') },
    { 'transitions.checkLists._id': 1 },
  );

结果:

{
transitions: [
  {
    "checkLists": [
      {
        "name": "One",
        "_id": "111"
      },
      {
        "name": "Two",
        "_id": "112"
      }
    ]
  }
]
}

预期结果:

[
  {
    "checkLists": [
      {
        "name": "One",
        "_id": "111"
      }
    ]
  }
]

感谢任何提示或解决方案

您可以使用:

db.collection.aggregate([
  {
    $match: {"transitions.checkLists._id": "111"}
  },
  {
    $project: {
      transitions: {
        $reduce: {
          "input": "$transitions",
          initialValue: [],
          in: {$concatArrays: ["$$value", "$$this.checkLists" ]}
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      checkLists: {
        $filter: {
          input: "$transitions",
          as: "item",
          cond: {$eq: ["$$item._id",  "111" ]}
        }
      }
    }
  }
])

正如您在 this playground example 上看到的那样。

$reduce用于“扁平化”你的列表,$filter用于只保留你想要的部分。

这是基于 一个基本相似但稍微复杂一点的问题。这里的解决方案只是一个简单的版本。