ChatGPT解决这个技术问题 Extra ChatGPT

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

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


S
Steven

这将是使用 aggregate 的更简单的方法:

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

当我尝试使用 "errmsg" : "exception: A pipeline stage specification object must contain exactly one field.", 时,我收到一条错误消息?
你如何分组排序呢?我想按 -1 排序计数
@FilipBartuzi 在文档页面中有一个示例,您必须向管道添加排序操作,如 { $sort: { count: -1 } }
我得到了与@Steven 相同的异常,这是因为我只复制粘贴了第 2 行并省略了周围的方括号。
@Steven,您必须使用类似 .aggregate(aggregate).exec(); 的方法正确执行它
c
csharpbd

我需要根据聚合函数的结果进行一些额外的操作。最后,我找到了聚合函数的一些解决方案,并根据 MongoDB 中的结果进行操作。我有一个包含字段 request, source, status, requestDate 的集合 Request

单字段分组方式和计数:

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

你能解释一下 {_id:{source:"$source",status:"$status"} 这个吗?
基本上,字段“_id”是每个文档的唯一标识符。该字段接受一个表达式。您可以通过根据分组条件组合多个字段来定义字段的值。您将在链接中找到有关该字段的更多详细信息:docs.mongodb.com/manual/reference/operator/aggregation/group/…
E
Eugen Sunic

如果您需要多个列进行分组,请遵循此模型。这里我通过 statustype 进行计数:

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

_id 表示封装多个字段的默认参数?
@RoyiNamir,请看一下链接。您可以在那里找到您的信息。 docs.mongodb.com/manual/reference/operator/aggregation/group/…
M
MattM

从 MongoDB 3.4 开始,您可以使用 $sortByCount 聚合。

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

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

例如:

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

这里可能值得注意的是,$sortByCount 实际上是一个“伪运算符”,就像从 MongoDB 3.4 引入的多个聚合阶段运算符一样。他们真正做的只是扩展到各自的聚合阶段。在这种情况下,现有答案中显示的带有 $sum: 1$group 和附加的 $sort 阶段。除了“键入更少的代码” 之外,它们没有提供任何优势,这可能更具描述性,也可能不更具描述性(如果您喜欢这类事情)。恕我直言,代码中不同的 $group$sort 阶段更具描述性,而且确实更灵活。
a
andre

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

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

p
prule

这种类型的查询对我有用:

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

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


K
Kaushik Das
    db.contest.aggregate([
        { $match:{.....May be some match criteria...}},
        { $project: {"province":1,_id:0}},
        { $sortByCount: "$province" }
    ],{allowDiskUse:true});

MongoDB 对内存的排序操作有 32 MB 的限制,使用 allowDiskUse : true 此选项,当您预先公开此查询数百万数据时,它将在磁盘级别而不是在内存中排序。 MongoDB 聚合管道有 100MB 的限制,所以使用 $project 来减少流向下一个管道的数据。如果您使用的是小数据,则无需使用 allowDiskUse 选项。


X
Xavier Guihot

Mongo 5.0 开始,我们还可以使用 { $count: { } } 作为 { $sum : 1 } 的别名:

// { "province" : "Champagne-Ardenne" }
// { "province" : "Champagne-Ardenne" }
// { "province" : "Haute-Normandie"   }
db.collection.aggregate([
  { $group: { _id: "$province", count: { $count: {} } } }
])
// { "_id" : "Champagne-Ardenne", "count" : 2 }
// { "_id" : "Haute-Normandie",   "count" : 1 }

R
Riha

对我有用的 Mongo shell 命令:

db.getCollection(<collection_name>).aggregate([{"$match": {'<key>': '<value to match>'}}, {"$group": {'_id': {'<group_by_attribute>': "$group_by_attribute"}}}])