根据二进制数据查找记录

时间:2013-01-10 16:28:13

标签: php mongodb mongodb-php

我在一个集合中有很多记录。它们用二进制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 添加了日志行。

3 个答案:

答案 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))