web-dev-qa-db-ja.com

mongoDBでObjectIDを持つドキュメントを検索する

ドキュメント(ObjectIDなし)をドキュメントに挿入すると、mongoDBは独自のObjectIDを追加します。

一意のObjectIDでドキュメントをクエリしたい。

$db->collection_name->find(array('_id'=>'4e49fd8269fd873c0a000000')));

'4e49fd8269fd873c0a000000'の前にあるMongoIDまたはObjectIDのプレフィックスでは機能しません。

PHPでmongoDBを使用してObjectIDでクエリを実行する適切な方法は何ですか?

27
jwchang

MongoId オブジェクトを使用する必要があることを確認してください。例:

$item = $collection->findOne(array(
    '_id' => new MongoId('4e49fd8269fd873c0a000000')));

Querying ページのメモは少し鈍いですが、言及しています...

ユーザーが特に指定しない限り、_idフィールドはMongoIdです。最も一般的な間違いは、文字列を使用してMongoIdと一致させることです。これらは2つの異なるデータ型であり、文字列「array()」が空の配列と同じではないのと同じ方法で互いに一致しないことに注意してください

56
Phil

APIがMongoDB\BSON\ObjectIDに変更されたと思います。また、[]を使用してPHP 5.4+の配列を示すことができるため、次のようになります。

$item = $collection->findOne(['_id' => new MongoDB\BSON\ObjectID( idToken )]);

フィルの答えに基づいています。

16
coolgod

MongoDBの最新バージョンであるMongoDB\Driver\Managerの場合、次の機能するコードを検討してください。

try {
  $DB_CONNECTION_STRING="mongodb://YourCredentials";
  require '../../vendor/autoload.php';
  $manager = new MongoDB\Driver\Manager( $DB_CONNECTION_STRING );

  $filter = ['_id' => new MongoDB\BSON\ObjectID( '5bdf54e6d722dc000f0aa6c2' )];
  $options = [];

  $query = new MongoDB\Driver\Query($filter, $options);     
  $docs = $manager->executeQuery('YourDbName.YourCollectionName', $query);
}
catch (MongoDB\Driver\Exception\Exception $e) { 
  $filename = basename(__FILE__); 
  echo "The $filename script has experienced an error.\n"; 
  echo "It failed with the following exception:\n"; 
  echo "Exception:", $e->getMessage(), "\n"; 
} 

テスト目的:

foreach ($docs as $doc) {
  print_r($doc);
  //or you can: echo "$doc->item  $row->qty  $row->status<br />";
}
1
Roman

alcaeus/mongo-php-adapter (php 7の場合)を使用して、\MongoIdからBSONタイプへ:

$filter = [];
$filter['_id'] = (new \MongoId('4e49fd8269fd873c0a000000'))->toBSONType();
$cursor = $collection->find($filter);
0
Elan Ruusamäe