Вы должны были бы использовать структуру агрегации, чтобы получить желаемый результат. Запустите следующий конвейер агрегации, который фильтрует документы в коллекции, входящей в конвейер для группировки, с использованием оператора . Это похоже на фильтр запросов find()
.
db.collection.aggregate([
{ "$match": { "age": { "$gte": 20 } } }, // filter on users with age >= 20
{
"$group": {
"_id": null,
"name": { "$push": "$name" },
"age": { "$push": "$age" },
"gender": { "$push": "$gender" }
}
},
{
"$project": {
"_id": 0,
"name": 1,
"age": 1,
"gender": 1
}
}
])
Пример вывод
{
"name": ["test1", "test2", "test3"],
"age": [20, 21, 30],
"gender": ["male", "female", "male"]
}
В приведенном выше трубопроводе, первый шаг трубопровода является $match
оператора, который аналогичен п SQL, где. В приведенном выше примере фильтруются входящие документы на поле age
(возраст больше или равен 20).
Следует отметить, что при выполнении трубопровода MongoDB соединяет операторы друг с другом. «Pipe» здесь означает значение Linux: выход оператора становится входом следующего оператора. Результатом каждого оператора является новая коллекция документов. Так Монго выполняет предыдущий трубопровод следующим образом:
collection | $match | $group | $project => result
Следующий этап трубопровода Оператор $group
. Внутри трубопровода вы группируете все отфильтрованные документы, в которых вы можете указать значение _id
null
для расчета накопленных значений для всех входных документов в целом. Используйте доступные accumulators, чтобы вернуть желаемую совокупность в сгруппированных документах. Оператор аккумулятора $ push используется в этой операции группировки, потому что он возвращает массив значений выражений для каждой группы.
Аккумуляторы, используемые в $group
стадии поддерживают свое состояние (например, итоговые данные, максимумы, минимумы и связанные с ними данные), как документы, по мере прохождения трубопровода.
Чтобы получить документы с нужной области, оператор $project
, который похож на SELECT
в SQL используется для переименования имен полей и выбора/отмены выбора полей, которые будут возвращены, из сгруппированных полей. Если вы укажете 0 для поля, он НЕ будет отправлен в конвейер для следующего оператора.
На самом деле '$ project' здесь не нужен. Еще одно поле в документе - это то, с чем можно жить. – styvane