从匹配条件的数组中的对象中提取值

时间:2019-06-08 12:10:37

标签: mongodb mongodb-query aggregation-framework

我需要帮助以在mongodb中建立聚合管道。

我正在使用的mongodb版本是4。

存储在数据库中的文档如下:

 [{
    _id : "xxxxxx",
    names : [
        { "lang" : "EN", value : "foo" },
        { "lang" : "IT", value : "bar" },
        { "lang" : "NOLANG", value : "baz" }
    ],
    some : "value"
},{
    _id : "yyyyyy",
    names : [
        { "lang" : "FR", value : "quux" },
        { "lang" : "IT", value : "quuux" },
        { "lang" : "NOLANG", value : "quuuux" }
    ],
    some : "value"
}]

我需要添加一个包含某种语言值的聚合字段(在此示例中,我将使用“ EN”),如果未找到具有请求语言的元素,则需要获取“ NOLANG”对象值

因此,聚合的结果必须类似于:

 [{
    _id : "xxxxxx",
    name : "foo",
    some : "value"
},{
    _id : "yyyyyy",
    name : "quuuux",
    some : "value"
}]

这是我写的管道:

[
    {
        $project : {
            names : 0,
            name: {
                $filter: {
                    input: '$names',
                    as: 'name',
                    cond: {
                        $switch: {
                            $branches: [
                                {
                                    case : {
                                        $eq : ["$$name.lang", "EN"]
                                    },
                                    then : "$$name.value"
                                } ,{
                                    case : {
                                        $eq : ["$$name.lang", "NOLANG"]
                                    },
                                    then : "$$name.value"
                                }
                            ],
                            default : ''
                        }
                    }
                }
            }
        }
    }
]

它给了我错误:预期为“ [”或AggregationStage,但找到了“ {”。

我做错了什么?有人可以帮我吗?

谢谢

1 个答案:

答案 0 :(得分:1)

您可以使用以下汇总

db.collection.aggregate([
  { "$project": {
    "some": 1,
    "name": {
      "$arrayElemAt": [
        "$names.value",
        {
          "$cond": [
            {
              "$ne": [
                { "$indexOfArray": ["$names.lang", "EN"] },
                -1
              ]
            },
            { "$indexOfArray": ["$names.lang", "EN"] },
            { "$indexOfArray": ["$names.lang", "NOLANG"] }
          ]
        }
      ]
    }
  }}
])

Output

[
  {
    "_id": "xxxxxx",
    "name": "baz",
    "some": "value"
  },
  {
    "_id": "yyyyyy",
    "name": "quuuux",
    "some": "value"
  }
]