如何将文档数组转换为二维数组

时间:2016-05-10 11:32:48

标签: mongodb mongodb-query aggregation-framework

我正在查询MongoDB

db.getCollection('user_actions').aggregate([
    {$match: {
        type: 'play_started', 
        entity_id: {$ne: null}
    }},
    {$group: {
        _id: '$entity_id', 
        view_count: {$sum: 1}
    }},
])

获取包含两个字段的文档列表:

enter image description here

如何获得包含两个项目的列表列表,例如

[[entity_id, view_count], [entity_id, view_count], ...]

1 个答案:

答案 0 :(得分:2)

实际上有两种不同的方法,具体取决于您的MongoDB服务器版本。

最佳方法是使用方括号[]在MongoDB 3.2中直接在$project阶段创建新的数组字段。这会为每个组返回一个数组。下一阶段是另一个$group阶段,您将文档分组并使用$push累加器运算符返回二维数组。

db.getCollection('user_actions').aggregate([
    { "$match": {
        "type": 'play_started', 
        "entity_id": { "$ne": null }
    }},
    { "$group": {
        "_id": "$entity_id", 
        "view_count": { "$sum": 1}
    }},
    {  "$project": {
        "_id": 0, 
        "result": [ "$_id", "$view_count" ] 
    }}, 
    { "$group": { 
        "_id": null, 
        "result": { "$push": "$result" }
    }}
])

从MongoDB 2.6和3.2之前,您需要一种不同的方法。要创建阵列,您需要使用$map运算符。因为$map"输入"字段必须解析为和数组,您需要使用$literal运算符将文字数组值设置为input。当然$cond运算符返回" entity_id"或" view_count"相应于" boolean-expression"。

db.getCollection('user_actions').aggregate([
    { "$match": {
        "type": 'play_started', 
        "entity_id": { "$ne": null }
    }},
    { "$group": {
        "_id": "$entity_id", 
        "view_count": { "$sum": 1}
    }},
    { "$project": {
        "_id": 0, 
        "result": { 
            "$map": { 
                "input": { "$literal": [ "A", "B"] }, 
                "as": "el", 
                "in": { 
                    "$cond": [
                        { "$eq": [ "$$el", "A" ] }, 
                        "$_id", 
                        "$view_count"
                    ]
                }
            }
        }
    }},
    { "$group": { 
        "_id": null, 
        "result": { "$push": "$result" }
    }}
])

值得注意的是,这也适用于MongoDB 2.4。如果您正在运行MongoDB 2.2,则可以使用未记录的$const运算符来执行相同的操作。