MongoDB在dicts列表中展平某些字段的结果列表

时间:2017-02-02 20:24:00

标签: mongodb mongodb-query aggregation-framework

免得说我有像

这样的数据
[{
  _id: 1, 
  items: [
    {a: 1, b: 2},
    {a: 2, b: 2},
    {a: 15, b: 7}
  ]
}, {
  _id: 2, 
  items: [
    {a: 15, b: 9},
    {a: 15, b: 9},
    {a: 41, b: 9}
  ]
}]

我想要items.a元素,所以我得到了

[[
  1,
  2,
  15
], [
  15,
  15,
  41
]]

我知道

db.collection.find({}, {"items.a": true, "_id": false})

将返回

[{
  items: [
    {a: 1},
    {a: 2},
    {a: 15}
  ]
}, {
  items: [
    {a: 15},
    {a: 15},
    {a: 41}
  ]
}]

这不是我想要的。

是否值得在MongoDB中计算它,或者我可以用Python计算它?

编辑: 如果我想通过例如检查它会怎样:返回包含items.a:1

的每个列表

所以结果应该是那种情况

[[
  1,
  2,
  15
]]

1 个答案:

答案 0 :(得分:1)

您可以运行以下聚合管道,该管道在 $map 管道中使用 $group 运算符来为映射元素创建值数组嵌入文档a字段:

db.collection.aggregate([
    {
        "$group": {
            "_id": null,
            "elements": {
                "$push": {
                    "$map": {
                        "input": "$items",
                        "as": "item",
                        "in": "$$item.a"
                    }
                }
            }
        } 
    }
])

示例输出:

{
    "_id" : null,
    "elements" : [ 
        [ 
            1, 
            2, 
            15
        ], 
        [ 
            15, 
            15, 
            41
        ]
    ]
}

如果您只想返回其中一个元素值为1的所有项目,则需要在分组之前放置 $match 过滤器,如以下内容:

db.collection.aggregate([
    { "$match": { "items.a": 1 } },
    {
        "$group": {
            "_id": null,
            "elements": {
                "$push": {
                    "$map": {
                        "input": "$items",
                        "as": "item",
                        "in": "$$item.a"
                    }
                }
            }
        } 
    }
])

示例输出

{
    "_id" : null,
    "elements" : [ 
        [ 
            1, 
            2, 
            15
        ]
    ]
}