我在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();
但我无法理解如何编写如上所述的查询。
答案 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