Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MongoDB中的计数_Php_Mongodb_Mapreduce_Nosql - Fatal编程技术网

Php MongoDB中的计数

Php MongoDB中的计数,php,mongodb,mapreduce,nosql,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_wher

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

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

Mongo db不像sql那样有计数

mongodb中的Count与列表或数组中的Count更相似

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

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

编辑:

要获得您想要的结果,您需要使用映射/减少


但请记住,这是一个更慢的操作,不是为了实时使用,而是在周期性的后台运行任务中使用,您需要在客户端使用Map/Reduce函数和排序结果。请参阅此问题:

如果您希望使用map reduce进行此类查询,那么您已经做错了

在这种情况下,MR将不会成为SQL聚合框架的性能替代品,也不会在您自己的应用程序中实时内联运行

但是,您可以使用聚合框架,这可能会提供您想要的性能。我对聚合框架有点生疏,这篇文章写得很快,但是这篇文章可能接近您的需要:

db.col.aggregate(
    {$match: {customer: XXX}}, 
    {$group: 
        {_id: "$code", name: "$name", count: {$sum: 1}}
    }
)
以下是参考资料:


当然,解决这个问题最有效、最简单的方法是以NoSQL方式设计模式,以避免此类查询:我不知道您当前的模式,但如果您希望经常执行类似的查询,它可能不面向NoSQL。

您所说的标准数据是什么意思?标题和标签是误导性的。。。你说得对,我加了几行,我希望现在更清楚这可能会对你有所帮助: