Как преобразовать массив документов в массив двух измерений
Я делаю запрос к 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], ...]
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