MongoDB SELECT COUNT GROUP BY

Я играю с 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++;
    }
});

Но существует ли более простой/более быстрый способ использования агрегатной функции?

Ответ 1

Это был бы более простой способ сделать это, используя aggregate:

db.contest.aggregate([
    {"$group" : {_id:"$province", count:{$sum:1}}}
])

Ответ 2

Если вам нужно сгруппировать несколько столбцов, следуйте этой модели. Здесь я веду подсчет по status и type:

  db.BusinessProcess.aggregate({
    "$group": {
        _id: {
            status: "$status",
            type: "$type"
        },
        count: {
            $sum: 1
        }
    }
   })

Ответ 3

Мне нужна дополнительная операция, основанная на результате агрегатной функции. Наконец, я нашел некоторое решение для агрегатной функции и операции, основанной на результате в 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}}
])

Ответ 4

Кроме того, если вам нужно ограничить группировку, вы можете использовать:

db.events.aggregate( 
    {$match: {province: "ON"}},
    {$group: {_id: "$date", number: {$sum: 1}}}  
)

Ответ 6

Начиная с MongoDB 3.4, вы можете использовать агрегацию $sortByCount.

Группирует входящие документы на основе значения указанного выражения, а затем вычисляет количество документов в каждой отдельной группе.

https://docs.mongodb.com/manual/reference/operator/aggregation/sortByCount/

Например:

db.contest.aggregate([
    { $sortByCount: "$province" }
]);