1

我在 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();

但我不明白如何编写像上面这样的查询。

4

3 回答 3

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 的。

于 2012-11-16T12:06:02.283 回答
0

Mongo db不像 sql 那样有计数。

mongodb 中的计数更像是对列表数组进行的计数

我建议您小心使用mongodb 中的计数,因为它们操作缓慢。

我建议您不要像在 sql 中那样进行计数,而是保留一个字段,其中保存列表的元素数,而不是每次需要其中的元素数时在该列表上使用计数

编辑:

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

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

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

于 2012-11-16T11:30:11.730 回答
0

您需要在客户端使用 Map/Reduce 功能并对结果进行排序。看到这个问题:Mongodb group and sort

于 2012-11-16T11:31:06.190 回答