我使用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/
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等作为此数组元素的内容。
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 中执行它