作为 mysql 查询:select sum(adet) from stok where isbn=$isbn
. 我想将此查询作为 mongodb 查询,但我无法进行。我已经阅读了一些代码示例,但我不明白它是如何工作的。
我需要一些帮助。
MongoDB 的查询语言不给我们执行求和的能力,但我们可以利用它的聚合框架来做到这一点。
给定以下示例数据:
> 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 }
我们可以使用以下管道(即聚合运算符序列)adet
对“foo”值的所有值求和:isbn
> db.stok.aggregate(
... { $match: { isbn: "foo"}},
... { $group: { _id: 1, sum: { $sum: "$adet" }}}
... );
{ "result" : [ { "_id" : 1, "sum" : 9 } ], "ok" : 1 }
在这里,我们通过isbn
字段缩小考虑的文档$match
,然后使用$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 shell,但您可以在 PHP 中使用MongoCollection::aggregate()辅助方法执行聚合查询,或者直接aggregate
使用MongoDB::command()调用命令。