作为mysql查询:select sum(adet) from stok where isbn=$isbn。我想把这个查询作为mongodb查询,但是我做不到。我读过一些代码示例,但我不明白它是如何工作的。
我需要些帮助。
发布于 2013-06-29 04:01:31
MongoDB的查询语言没有给我们提供执行求和的能力,但我们可以利用它的aggregation framework来执行。
给定以下示例数据:
> db.stok.insert({ isbn:"foo", adet: 5 })
> db.stok.insert({ isbn:"foo", adet: 3 })
> db.stok.insert({ isbn:"foo", adet: 1 })
> db.stok.insert({ isbn:"bar", adet: 2 })
> db.stok.insert({ isbn:"bar", adet: 4 })
> db.stok.find()
{ "_id" : ObjectId("51cde94037a16345b5316987"), "isbn" : "foo", "adet" : 5 }
{ "_id" : ObjectId("51cde94437a16345b5316988"), "isbn" : "foo", "adet" : 3 }
{ "_id" : ObjectId("51cde94b37a16345b5316989"), "isbn" : "foo", "adet" : 1 }
{ "_id" : ObjectId("51cde95337a16345b531698a"), "isbn" : "bar", "adet" : 2 }
{ "_id" : ObjectId("51cde95637a16345b531698b"), "isbn" : "bar", "adet" : 4 }我们可以将"foo“isbn值的所有adet值相加,使用以下管道(即聚合操作符序列):
> db.stok.aggregate(
... { $match: { isbn: "foo"}},
... { $group: { _id: 1, sum: { $sum: "$adet" }}}
... );
{ "result" : [ { "_id" : 1, "sum" : 9 } ], "ok" : 1 }在这里,我们使用$match通过isbn字段缩小考虑的文档范围,然后使用$group将所有文档收集到单个存储桶中,并将adet字段与总和聚合在一起。
我们还可以通过在分组中使用非常数isbn来计算每个不同_id值的总和:
> db.stok.aggregate({ $group: { _id: "$isbn", sum: { $sum: "$adet" }}});
{
"result" : [
{
"_id" : "bar",
"sum" : 6
},
{
"_id" : "foo",
"sum" : 9
}
],
"ok" : 1
}上面的例子使用了JS,但是您可以使用MongoCollection::aggregate()助手方法,或者通过使用MongoDB::command()直接调用aggregate命令,在PHP中执行聚合查询。
https://stackoverflow.com/questions/17359848
复制相似问题