0

作为 mysql 查询:select sum(adet) from stok where isbn=$isbn. 我想将此查询作为 mongodb 查询,但我无法进行。我已经阅读了一些代码示例,但我不明白它是如何工作的。

我需要一些帮助。

4

1 回答 1

0

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()调用命令。

于 2013-06-28T20:01:31.343 回答