Как преобразовать массив документов в массив двух измерений



Я делаю запрос к MongoDB



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


И получение списка документов с двумя полями:



Введите описание изображения здесь



Как я могу получить список списков с двумя элементами, такими как



[[entity_id, view_count], [entity_id, view_count], ...]
600   1  

1 ответ:

На самом деле есть два различных способа сделать это, в зависимости от версии вашего сервера 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 "input" должно разрешаться в массив, который вы должны использовать $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, который делает то же самое.

Comments

    Ничего не найдено.