我在一个集合中有很多记录。它们用二进制uuid索引:
db.users.find().limit(1);
[{ "_id": ..., "guid": BinData(2,"EAAAANR56IodpE3xhYLtfugc7SY="), otherdata }]
如果我从CLI查询,我可以检索记录:
db.users.find({ "guid": BinData(2,"EAAAANR56IodpE3xhYLtfugc7SY=") });
[{ "_id": ..., "guid": BinData(2,"EAAAANR56IodpE3xhYLtfugc7SY="), otherdata }]
如果我想从PHP做同样的事情,查询什么也不返回:
$client->db->setProfilingLevel(2);
$res = $client->db->users->find(array('guid' => new MongoBinData($bin_data, 2)));
$res->next(); // perform the query
echo $res->count(); // display 0
当然,我已经测试了$bin_data
变量保持正确的值。
如果我查看mongo的日志,
Thu Jan 10 18:05:06 [conn1] query db.users query: { guid: BinData } ntoreturn:0 ntoskip:0 nscanned:0 keyUpdates:0 locks(micros) r:14807 nreturned:0 reslen:20 14ms
scanned
值为0!这意味着它甚至不会扫描集合中的结果吗?
有任何线索吗?
编辑我已将分析级别设置为2,它确实会更改任何内容。我可以在日志中看到身份验证,但仍然没有查询。
Edit2 添加了日志行。
答案 0 :(得分:2)
我必须承认自己很困惑。我跑了:
$mongo = new Mongo();
$db = $mongo->mydb;
$col = $db->gjgjgj->insert(
array( "guid" => new MongoBinData("EAAAANR56IodpE3xhYLtfugc7SY=", 2) )
);
var_dump($col);
$cur = $db->gjgjgj->find(
array( "guid" => new MongoBinData("EAAAANR56IodpE3xhYLtfugc7SY=", 2) )
);
var_dump(iterator_to_array($cur));
我的输出是:
boolean true
array
'50ef0bc96803fa0b04000000' =>
array
'_id' =>
object(MongoId)[7]
public '$id' => string '50ef0bc96803fa0b04000000' (length=24)
'guid' =>
object(MongoBinData)[9]
public 'bin' => string 'EAAAANR56IodpE3xhYLtfugc7SY=' (length=28)
public 'type' => int 2
您能告诉我们这是什么PHP驱动程序版本吗?
您是否还可以发布可以重现此内容的整个脚本?
当然,在光标上运行count()
后运行next()
对我也有用。
答案 1 :(得分:1)
默认情况下,Mongo不会记录所有查询。仅记录慢查询(通常超过100毫秒)。另请查看有关分析的docs。
答案 2 :(得分:1)
您可以使用php中的mongoDB分析来查看那里发生的事情
http://php.net/manual/en/mongodb.setprofilinglevel.php
$this->command(array('profile' => 2))