MongoDB SELECT COUNT GROUP BY

112

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

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

Теги:
group-by

6 ответов

217
Лучший ответ

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

db.contest.aggregate([
    {"$group" : {_id:"$province", count:{$sum:1}}}
])
  • 1
    Я получаю сообщение об ошибке при попытке "errmsg" : "exception: A pipeline stage specification object must contain exactly one field.",
  • 1
    NVM я разобрался, просто потребовал немного возиться с этим
Показать ещё 3 комментария
35

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

  db.BusinessProcess.aggregate({
    "$group": {
        _id: {
            status: "$status",
            type: "$type"
        },
        count: {
            $sum: 1
        }
    }
   })
  • 1
    _id представляет параметр по умолчанию для инкапсуляции нескольких полей?
33

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

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

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

Этот тип запроса работал у меня:

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

См. http://docs.mongodb.org/manual/tutorial/aggregation-with-user-preference-data/

0

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

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

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

Например:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню