Py学习  »  MongoDB

如何在MongoDB中获得数组字段值的不同组合[duplicate]

Lior Magen • 4 年前 • 633 次点击  

我在和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++;
    }
});

但是有没有一种更简单/更快的方法来使用聚合函数呢?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/53510
 
633 次点击  
文章 [ 7 ]  |  最新文章 4 年前
Riha
Reply   •   1 楼
Riha    4 年前

对我有用的Mongo shell命令:

db.getCollection(<collection_name>).aggregate([{"$match": {'<key>': '<value to match>'}}, {"$group": {'_id': {'<group_by_attribute>': "$group_by_attribute"}}}])
prule
Reply   •   2 楼
prule    9 年前

这类查询对我有效:

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

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

MattM
Reply   •   3 楼
MattM    5 年前

$sortByCount 聚合。

根据指定表达式的值对传入文档进行分组,然后计算每个不同组中文档的计数。

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

db.contest.aggregate([
    { $sortByCount: "$province" }
]);
André
Reply   •   4 楼
André    6 年前

此外,如果需要限制分组,可以使用:

db.events.aggregate( 
    {$match: {province: "ON"}},
    {$group: {_id: "$date", number: {$sum: 1}}}  
)
Eugene Sunic KitkatJohn
Reply   •   5 楼
Eugene Sunic KitkatJohn    5 年前

如果需要按多个列分组,请遵循此模型。在这里,我正在通过 status type :

  db.BusinessProcess.aggregate({
    "$group": {
        _id: {
            status: "$status",
            type: "$type"
        },
        count: {
            $sum: 1
        }
    }
   })
csharpbd
Reply   •   6 楼
csharpbd    7 年前

我需要一些基于聚合函数结果的额外操作。最后在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}}
])

多个字段按计数分组,并使用计数排序:

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}},
    {$sort:{"count":-1}}
])
Steven Anand Jayabalan
Reply   •   7 楼
Steven Anand Jayabalan    10 年前

这样做比较容易 aggregate

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