MongoDB выберите количество групп по


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

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

5 98

5 ответов:

это будет простой способ сделать это с помощью aggregate:

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

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

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

мне нужна дополнительная операция, основанная на результате агрегатной функции. Наконец, я нашел некоторое решение для агрегатной функции и операции, основанной на результате в MongoDB. У меня есть коллекция Request в поле request, source, status, requestDate.

Одна Группа Полей По & Count:

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

Несколько Полей Группируются По & Count:

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}}
])

группа полей и Граф с помощью графа:

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}},
    {$sort:{"count":-1}}
])

этот тип запроса работал для меня:

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

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

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

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