Я играю с MongoDB, пытаясь понять, как сделать простой
SELECT province, COUNT(*) FROM contest GROUP BY province
Но я не могу понять, используя эту функцию. Я могу сделать это, используя какой-то действительно странный синтаксис группы
db.user.group({
"key": {
"province": true
},
"initial": {
"count": 0
},
"reduce": function(obj, prev) {
if (true != null) if (true instanceof Array) prev.count += true.length;
else prev.count++;
}
});
Но существует ли более простой/более быстрый способ использования агрегатной функции?
Это был бы более простой способ сделать это, используя aggregate
:
db.contest.aggregate([
{"$group" : {_id:"$province", count:{$sum:1}}}
])
"errmsg" : "exception: A pipeline stage specification object must contain exactly one field.",
Если вам нужно сгруппировать несколько столбцов, следуйте этой модели. Здесь я веду подсчет по status
и type
:
db.BusinessProcess.aggregate({
"$group": {
_id: {
status: "$status",
type: "$type"
},
count: {
$sum: 1
}
}
})
Мне нужна дополнительная операция, основанная на результате агрегатной функции. Наконец, я нашел некоторое решение для агрегатной функции и операции, основанной на результате в MongoDB. У меня есть коллекция Request
с полем request, source, status, requestDate
.
Единая группа полей по количеству и количеству:
db.Request.aggregate([
{"$group" : {_id:"$source", count:{$sum:1}}}
])
Поля нескольких полей и количество:
db.Request.aggregate([
{"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}}
])
Множество полей по группам и подсчету с помощью сортировки по полю:
db.Request.aggregate([
{"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}},
{$sort:{"_id.source":1}}
])
Несколько полей по группам и подсчету с помощью сортировки с использованием Count:
db.Request.aggregate([
{"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}},
{$sort:{"count":-1}}
])
Кроме того, если вам нужно ограничить группировку, вы можете использовать:
db.events.aggregate(
{$match: {province: "ON"}},
{$group: {_id: "$date", number: {$sum: 1}}}
)
Этот тип запроса работал у меня:
db.events.aggregate({$group: {_id : "$date", number: { $sum : 1} }} )
См. http://docs.mongodb.org/manual/tutorial/aggregation-with-user-preference-data/
Начиная с MongoDB 3.4, вы можете использовать агрегацию $sortByCount
.
Группирует входящие документы на основе значения указанного выражения, а затем вычисляет количество документов в каждой отдельной группе.
https://docs.mongodb.com/manual/reference/operator/aggregation/sortByCount/
Например:
db.contest.aggregate([
{ $sortByCount: "$province" }
]);