从PHP Mongo驱动程序发出简单查询时遇到一些麻烦。 这是shell查询:
db.testing.distinct('summary.type').sort();
根据文档,我可以使用db->command
来使用不同的查询。这是我尝试过的:
$all_types = $db->command(
array(
"distinct" => "summary.type",
"key" => "summary.type"
)
);
var_dump($all_types);
但是我没有收回我期望的数据,而只获得了包含stats
,nscanned
和nscannedObjects
等索引的游标。
我做错了什么?
谢谢, 的 NS
答案 0 :(得分:1)
命令不返回MongoCursor对象,但始终只返回一个文档。与findOne()
一样。在此返回的文档中,返回数组中的values
数组元素包含所有结果的数组:
<?php
$m = new Mongo; $c = $m->demo->pubs; $c->drop();
$c->insert( array( 'name' => 'Betsy Smith', 'city' => 'London' ) );
$c->insert( array( 'name' => 'London Tavern', 'city' => 'London' ) );
$c->insert( array( 'name' => 'Lammars', 'city' => 'Manchester' ) );
$c->insert( array( 'name' => 'Weatherspoons', 'city' => 'Coventry' ) );
$r = $m->demo->command( array(
'distinct' => 'pubs',
'key' => 'city',
'query' => array( 'name' => array( '$ne' => 'Weatherspoons' ) )
) );
var_dump( $r['values'] );
?>
返回:
array(2) {
[0] =>
string(6) "London"
[1] =>
string(10) "Manchester"
}
答案 1 :(得分:1)
您要查找的结果实际上是命令响应的values
键。如果您查看var_dump()
的整个输出,您会看到values
,stats
(您提到的)和ok
的关键字。
在JavaScript控制台上,集合的distinct()
辅助函数实际上为您解开了解包,在查看源代码时可以看到:
> db.testing.distinct
function (keyString, query) {
var res = this._distinct(keyString, query);
if (!res.ok) {
throw "distinct failed: " + tojson(res);
}
return res.values;
}
另外,我相信您通过PHP驱动程序发出的命令有错误。 distinct
选项应引用集合名称,key
应引用字段名称。有关详细信息,请参阅Distinct docs。