Mongodb组和排序

Sre*_*raj 25 mongodb

我使用mongod作为rails 3的数据库

我如何在mongod中执行以下sql的类似代码.有没有办法在mongod中执行group和sort

select a,b,sum(c) csum from coll where active=1 group by a,b order by a
Run Code Online (Sandbox Code Playgroud)

谢谢

B.M*_*.W. 18

在mongo的网站上受到这个例子的启发.

生成虚拟数据:

> db.stack.insert({a:1,b:1,c:1,active:1})
> db.stack.insert({a:1,b:1,c:2,active:0})
> db.stack.insert({a:1,b:2,c:3,active:1})
> db.stack.insert({a:1,b:2,c:2,active:0})
> db.stack.insert({a:2,b:1,c:3,active:1})
> db.stack.insert({a:2,b:1,c:10,active:1})
> db.stack.insert({a:2,b:2,c:10,active:0})
> db.stack.insert({a:2,b:2,c:5,active:1})
Run Code Online (Sandbox Code Playgroud)

MONGO QUERY:

> db.stack.aggregate(
... {$match:{active:1}},
... {$group:{_id:{a:"$a", b:"$b"}, csum:{$sum:"$c"}}},
... {$sort:{"_id.a":1}})
Run Code Online (Sandbox Code Playgroud)

结果:

{"result" : [
    {"_id" : {"a" : 1,"b" : 2},"csum" : 3},
    {"_id" : {"a" : 1,"b" : 1},"csum" : 1},
    {"_id" : {"a" : 2,"b" : 2},"csum" : 5},
    {"_id" : {"a" : 2,"b" : 1},"csum" : 13}
],"ok" : 1}
Run Code Online (Sandbox Code Playgroud)

(注意:我重新格式化了shell结果,因此它更具可读性)


Mar*_*ius 17

使用聚合框架,您可以执行以下操作:

db.coll.aggregate({ 
    $group: { 
        _id: "$a", 
        countA: { $sum: 1}, 
        sumC:{ $sum: "$c"}, 
    },
    $sort:{a:1}
});
Run Code Online (Sandbox Code Playgroud)

但是,如果您有太多数据,您可能会收到以下错误消息:

{
    "errmsg" : "exception: aggregation result exceeds maximum document size (16MB)",
    "code" : 16389,
    "ok" : 0
}
Run Code Online (Sandbox Code Playgroud)

在此处查看有关SQL to Mongo翻译的更多信息:http://docs.mongodb.org/manual/reference/sql-aggregation-comparison/

  • 这不再起作用了:"管道阶段规范对象必须只包含一个字段." (3认同)

Yur*_*rov 5

mongodb聚合API似乎已更改。现在你会做

db.coll.aggregate([
  {
     $group: { 
        _id: "$a", 
        countA: { $sum: 1}, 
        sumC:{ $sum: "$c"}, 
     }
  },
  {
    $sort:{a:1}
  }
])
Run Code Online (Sandbox Code Playgroud)

请注意Aggregate()的参数的Array语法。您还将添加链接$ match,$ limit等作为此数组元素的内容。


Ser*_*ruk 1

db.coll.group(
       {key: { a:true, b:true },
        cond: { active:1 },
        reduce: function(obj,prev) { prev.csum += obj.c; },
        initial: { csum: 0 }
        });
Run Code Online (Sandbox Code Playgroud)

您可以在 MongoDB 中执行它

  • 只有组,排序/排序依据在哪里? (8认同)