Py学习  »  MongoDB

MongoDB聚合:通过匹配条件从数组中的对象中提取值

gdg • 4 年前 • 348 次点击  

我需要帮助在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,但找到了“”。

我做错什么了?有人能帮我吗?

谢谢

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/34299
 
348 次点击  
文章 [ 1 ]  |  最新文章 4 年前
Fanpark
Reply   •   1 楼
Fanpark    4 年前

您可以使用下面的聚合

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"
  }
]