从文档中查询嵌套数组

Query nested array from document

给定名为 'blah'...

的集合中的以下文档数据
[
{
    "_id" : ObjectId("60913f55987438922d5f0db6"),
    "procedureCode" : "code1",
    "description" : "Description 1",
    "coding" : [
        {
            "system" : "ABC",
            "code" : "L111"
        },
        {
            "system" : "DEFG",
            "code" : "S222"
        }
    ]
},
{
    "_id" : ObjectId("60913f55987438922d5f0dbc"),
    "procedureCode" : "code2",
    "description" : "Description 2",
    "coding" : [
        {
            "system" : "ABC",
            "code" : "L999"
        },
        {
            "system" : "DEFG",
            "code" : "X3333"
        }
    ]
}
]

我想要得到的是所有 systemABC 的所有编码元素,对于所有 parents,以及一个 codes 的数组。

[
{ "code": "L111" },
{ "code": "L999" },
]

如果我使用 db.getCollection('blah').find({"coding.system": "ABC"}),我会在 ICDcoding 数组中获得包含任何 child 的 parent 文档。

如果我使用...

db.getCollection("blah")
    .find({ "coding.system": "ABC" })
    .projection({ "coding.code": 1 })

我确实得到了 parent 文件,其中 child 系统为“ABC”,但“DEFG”的编码似乎也随之而来。

{
    "_id" : ObjectId("60913f55987438922d5f0db6"),
    "coding" : [
        {
            "code" : "L989"
        },
        {
            "code" : "S102"
        }
    ]
},
{
    "_id" : ObjectId("60913f55987438922d5f0dbc"),
    "coding" : [
        {
            "code" : "L989"
        },
        {
            "code" : "X382"
        }
    ]
}

我也尝试过:

 db.getCollection("blah").aggregate(
   { $unwind: "$coding" },
   { $match: { "system": "ICD" } }
 );

.. 根据此页面: ......但是这种方法不会很快。即根本没有记录。

请问我需要什么查询才能实现这样的目标..?

[
{ "code": "L111" },
{ "code": "L999" },
...
]

甚至更好,这个..?

[
"L111",
"L999",
...
]
db.collection.aggregate([
  {
    $match: { "coding.system": "ABC" }
  },
  {
    $unwind: "$coding"
  },
  {
    $match: { "coding.system": "ABC" }
  },
  {
    $project: { code: "$coding.code" }
  }
])

mongoplayground


db.collection.aggregate([
  {
    $match: { "coding.system": "ABC" }
  },
  {
    $unwind: "$coding"
  },
  {
    $match: { "coding.system": "ABC" }
  },
  {
    $group: {
      _id: null,
      coding: { $push: "$coding.code" }
    }
  }
])

mongoplayground

您也可以使用 $filter:

而不是 $unwind$match
db.collection.aggregate([
  { $match: { "coding.system": "ABC" } },
  {
    $project: {
      coding: {
        $filter: {
          input: "$coding",
          cond: { $eq: [ "$$this.system", "ABC" ] }
        }
      }
    }
  }
])