在MongoDB中计数

时间:2012-11-16 11:12:33

标签: php mongodb mapreduce nosql

我在SQL中有这个查询:

"SELECT code, name, count(*) FROM table WHERE customer = "XXX" GROUP BY code ORDER BY count(*) DESC;

我正在使用PHP,我将为mongodb翻译此SQL查询。我知道我要用mongodb计算这样的事情:

$array_where_condition = array("customer" => "XXX");
$db->find($array_where_condition)->count();

但我无法理解如何编写如上所述的查询。

3 个答案:

答案 0 :(得分:3)

如果您希望将map reduce用于此类查询,那么您已经做错了。

在这种情况下,MR不会成为SQL聚合框架的高效替代品,并且不会实时内联到您自己的应用程序。

但是,您可以使用聚合框架,这可能会提供您正在寻找的性能。我对聚合框架有点生疏,这写得很快但是这可能与你需要的东西很接近:

db.col.aggregate(
    {$match: {customer: XXX}}, 
    {$group: 
        {_id: "$code", name: "$name", count: {$sum: 1}}
    }
)

以下是参考:http://docs.mongodb.org/manual/reference/aggregation/

当然,解决此问题的最高效和最简单的方法是以NoSQL方式设计您的架构以避免这些类型的查询:http://www.mongodb.org/display/DOCS/Schema+Design我不知道您当前的架构但它可能不是NoSQL如果您希望经常进行查询,请找到方向。

答案 1 :(得分:0)

Mongo db没有像sql那样的计数

mongodb中的

计数更像是计数,您可以在列表数组上执行

我建议你小心mongodb中的 count ,因为它们操作很慢。

我建议您保留一个字段,其中包含列表元素的数量,而不是在列表中使用计数。每次你需要它的元素数量

修改

要获得您想要的结果,您需要使用 map / reduce

http://www.mongovue.com/2010/11/03/yet-another-mongodb-map-reduce-tutorial/

但请记住,这是一个更慢的操作,不是为了实时使用,而是在定期后台运行任务中更多

答案 2 :(得分:0)

您需要在客户端使用Map / Reduce函数和排序结果。请参阅此问题:Mongodb group and sort