web-dev-qa-db-fra.com

Trouver un document avec ObjectID dans mongoDB

Lorsque j'ai inséré des documents dans une collection (sans ObjectID), mongoDB ajoute ses propres ObjectID.

Je veux interroger un document par son ObjectID unique.

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

Cela ne fonctionne pas avec le préfixe MongoID ou ObjectID devant '4e49fd8269fd873c0a000000'.

Quelle est la bonne façon de faire une requête par ObjectID avec mongoDB en PHP?

23
InspiredJW

Vous êtes sûr que vous devez utiliser un objet MongoId , par exemple

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

Les notes sur la page Interrogation sont un peu obtuses, mais il est fait mention de ...

Sauf indication contraire de l'utilisateur, le champ _id est un MongoId. L'erreur la plus courante consiste à utiliser une chaîne pour correspondre à un MongoId. N'oubliez pas qu'il s'agit de deux types de données différents et qu'ils ne se correspondent pas de la même manière que la chaîne "array ()" n'est pas identique à un tableau vide.

55
Phil

Je pense que maintenant, l'API change de MongoDB\BSON\ObjectID, vous pouvez aussi utiliser [] pour désigner un tableau dans PHP 5.4+, ainsi il devrait être:

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

basé sur la réponse de Phil.

14
coolgod

Pour MongoDB\Driver\Manager, une version moderne de MongoDB, vous pouvez envisager le code de travail suivant:

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"; 
} 

À des fins de test:

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

Avec alcaeus/mongo-php-adapter (sous PHP 7), nécessaire pour convertir \MongoId au type BSON:

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