从数组和 select 字段中过滤对象

filter object from array and select field

我有一个包含名称值对的对象列表,但我不知道如何从名称为特定值的数组中检索值。

例如:

    {
            "ordernumber" : "192915",
            "orderparameters" : {
                    "list" : [
                            {
                                    "composite" : null,
                                    "name" : "CURRENCY_CODE",
                                    "value" : "NOK",
                                    "type" : "String"
                            },
                            {
                                    "composite" : null,
                                    "name" : "NEED_CUSTOMS_DOCUMENT",
                                    "value" : "True",
                                    "type" : "Boolean"
                            }
              ]}
    }

现在我需要找到带有

的物品的价值

"name": "NEED_CUSTOMS_DOCUMENT"

所以在这种情况下

"value": "True"

我可以列出所有值

 db.orders.aggregate({ $match: { ordernumber:'1234' } }, { $project: { 'orderparameters.list.name': 1 } }).pretty()

但是如何从具有该名称的索引中检索值字段?

每个文档的索引可能不同,所以我不能简单地查询“orderparameters.list.1.value”

优化您的聚合管道以包含另一个带有 $filter 运算符的阶段,这样您就可以根据给定条件过滤列表,如下所示:

db.orders.aggregate([
    { $match: { 
        ordernumber: "1234", 
        "orderparameters.list.name": "NEED_CUSTOMS_DOCUMENT" 
    } },
    { $project: {
       list: {
          $filter: {
              input: "$orderparameters.list",
              cond: { $eq: ["$$this.name", "NEED_CUSTOMS_DOCUMENT"] }
          }
       } 
    } },
    { $project: { values: "$list.value" } }
])

有专门为此设计的运算符

$elemMatch

The $elemMatch operator matches documents that contain an array field with at least one element that matches all the specified query criteria.

db.orders.aggregate({ $match: { 'orderparameters.list': { $elemMatch: { name: "NEED_CUSTOMS_DOCUMENT", value: "True" } } } })

db.orders.find({ 'orderparameters.list': { $elemMatch: { name: "NEED_CUSTOMS_DOCUMENT", value: "True" } } })