1

我的收藏中有很多记录。它们使用二进制 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

值为scanned0 !这意味着它甚至不扫描集合以获取结果?

有什么线索吗?

编辑我已将分析级别设置为 2,它确实改变了任何东西。我可以在日志中看到身份验证,但仍然没有查询。

Edit2添加了日志行。

4

3 回答 3

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()运行 a 后运行也适用于我。next()

于 2013-01-10T18:45:54.840 回答
1

Mongo 默认不记录所有查询。只记录慢查询(通常需要超过 100 毫秒)。另请查看有关分析的文档。

于 2013-01-10T16:32:58.207 回答
1

您可以使用 php 中的 mongoDB 分析来查看那里发生了什么

http://php.net/manual/en/mongodb.setprofilinglevel.php

$this->command(array('profile' => 2))
于 2013-01-10T16:37:59.330 回答