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変数が正しい値を保持することをテストしました。

モンゴのログを見ると、

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

phpからのmongoDBプロファイリングを使用して、そこで何が起こっているかを確認できます

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

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

デフォルトでは、Mongo はすべてのクエリをログに記録するわけではありません。遅いクエリ (通常は 100 ミリ秒以上かかる) のみがログに記録されます。プロファイリングに関するドキュメントもチェックしてください。

于 2013-01-10T16:32:58.207 に答える