it-swarm.com.ru

Найти документ с ObjectID в mongoDB

Когда я вставляю некоторые документы в коллекцию (без ObjectID), mongoDB добавляет свои собственные ObjectID.

Я хочу запросить документ по его уникальному ObjectID.

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

Он не работает с префиксом MongoID или ObjectID перед '4e49fd8269fd873c0a000000'.

Что такое правильный способ запроса по ObjectID с mongoDB в PHP?

23
InspiredJW

Вы наверняка должны использовать объект MongoId , например

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

Примечания на странице Querying немного тупые, но в них упоминается ...

Если пользователь не указал иное, поле _id является MongoId. Наиболее распространенной ошибкой является попытка использовать строку для совпадения с MongoId. Помните, что это два разных типа данных, и они не будут соответствовать друг другу так же, как строка «array ()» не совпадает с пустым массивом.

55
Phil

Я думаю, что теперь API меняется на MongoDB\BSON\ObjectID, также вы можете использовать [] для обозначения массива в PHP 5.4+, поэтому оно должно быть:

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

основываясь на ответе Фила.

14
coolgod

Для MongoDB\Driver\Manager, современной версии MongoDB, вы можете рассмотреть следующий рабочий код:

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 />";
}
0
Roman

С alcaeus/mongo-php-adapter (под php 7), необходим для преобразования \MongoId в тип BSON:

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