MongoDB count()在php中是不同的

MongoDB count()在php中是不同的,php,mongodb,count,distinct,Php,Mongodb,Count,Distinct,我想知道如何使用php计算这个简单mongodb查询的结果数 <?php //connection to mongodb $collection = new MongoCollection($db, 'User'); $retval = $collection->distinct("age"); var_dump($retval); ?> 如何计算$retval变量中的结果数?MongoDB的PHP文档描述了如何计算getting集合中的结果数:

我想知道如何使用php计算这个简单mongodb查询的结果数

<?php

//connection to mongodb

  $collection = new MongoCollection($db, 'User');

  $retval = $collection->distinct("age");

    var_dump($retval);
?>


如何计算$retval变量中的结果数?

MongoDB的PHP文档描述了如何计算getting集合中的结果数:

为了使计数超过不同的结果,您可以在组收集中创建映射减少,例如以下示例:

<?php
$retval = $collection->group(
    array('age' => true), // field(s) to group by
    array('count' => 0), 
    new MongoCode('function(doc, prev) { prev.count += 1 }'), 
    array(null) // condition
    );
?>
函数将当前文档和聚合带到此点,并执行聚合。最后,您可以获得计数:

print($retval["count"]);

Soory,要知道$retval中有多少结果很简单。写下这句话:

echo count($retval);

我的解决方案返回一个指定项的子项计数。不是简单的不同集合的计数^^

例如,如果您有以下数据:

Age:  |  User:
--------------
{ "age":"20", "name":"David" }, 
{ "age":"20", "name":"Goerge" }, 
{ "age":"22", "name":"tiffany" }
“我的解决方案”返回一个数组,并在每次使用该数组时返回,例如:

foreach ($retval as $row) 
       echo($row['age'] . ': ' . $row['count'] . "\n");
返回的数据:

20 : 2
22 : 1

新的聚合框架将简化这一过程:

$collection=newmongocollection($db,'contacts');
$keys=数组(“部门”=>1);
//设定初始值
$initial=数组(“计数”=>0);
//要执行的JavaScript函数
$reduce=“函数(obj,prev){prev.count++;}”;
//仅使用“状态”字段为ar的文档
$condition=array('condition'=>array(“State”=>AR'));
$results=$collection->group($key、$initial、$reduce、$condition);
foreach($results['retval']作为$key=>$value){
echo“与部门的AR状态联系人”。$value['department']为:'。$value['count'];
回声“
”; }
您能否发布var_dump($retval)的输出
var_dump(sizeof($retval))
因为
distinct
返回一个唯一值数组。@Sammaye是的,我知道!我也有同样的问题,但在java解决方案中。在对如何计算不同结果进行了大量研究之后,我什么也没发现。有两种基本方法可以做到这一点,使用直接JavaScript(用于简单查询)或Map Reduce。对于JavaScript,只需在后面使用“.length”属性,例如:
db.collection.distinct(“age”).length
所以我使用了组by。最后,结果是一样的,但是“分组方式”消耗了更多的资源。为什么不使用Java版本的
.length
?因为我不能在后端使用javascript!但是您可以在Java中通过计算返回的数组元素来执行
.length
,这就是
.length
所做的。事实上,Java中的数组有一个长度字段,可以通过使用
group()访问该字段来理解与JavaScript
.length
完全相同的内容
实际上与后端中的evaling javascript相同,因此如果必须通过eval调用
.length
,它实际上会比group命令$condition(可选)更快
20 : 2
22 : 1
$project = array('$project'=> array("age"=>1)); //pick only the age field
$group = array('$group'=>array("_id"=>'$age')); //group by age field
$count = array('$group'=>array("_id"=>null,"count"=>array('$sum'=>1))); //count distinct    
$result = $collection->aggregate(array($project,$group,$count));
echo $result['result'][0]['count']; 
$collection = new MongoCollection($db, 'contacts');  

$keys = array("Department" => 1);

// set intial values
$initial = array("count" => 0);

// JavaScript function to perform
$reduce = "function (obj, prev) { prev.count++; }";


// only use documents where the "state" field is ar

$condition = array('condition' => array("State" => 'AR'));

$results = $collection->group($keys, $initial, $reduce, $condition);

foreach ($results['retval'] as $key => $value) {
    echo 'Contacts in state AR with department '.$value['Department'] . ' are:'. $value['count'];
    echo '<br />';
}