Find a document with ObjectID in mongoDB
Asked Answered
L

4

30

When I inserted some documents into a collection (without an ObjectID) mongoDB adds its own ObjectIDs.

I want to query a document by its unique ObjectID.

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

It does not work either with prefix of MongoID or ObjectID in front of '4e49fd8269fd873c0a000000'.

What is the proper way to query by ObjectID with mongoDB in PHP?

Ladyinwaiting answered 16/8, 2011 at 6:20 Comment(1)
It works in console with "ObjectID" in front of 4e49fd... but not in PHP.Ladyinwaiting
D
57

Pretty sure you have to use a MongoId object, eg

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

The notes on the Querying page are a little obtuse but it does mention...

Unless the user has specified otherwise, the _id field is a MongoId. The most common mistake is attepting to use a string to match a MongoId. Keep in mind that these are two different datatypes, and will not match each other in the same way that the string "array()" is not the same as an empty array

Dominik answered 16/8, 2011 at 6:27 Comment(1)
I write same query, but query is not working. $collection = $db->Collection("video_detail"); $cursor = $collection->findOne(array('user_id' => new MongoId("575289f33a31b98a4c8b4567")));Graven
H
29

I think now the API changes to MongoDB\BSON\ObjectID, also you can use [] to denote an array in PHP 5.4+, so it should be:

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

based on Phil's answer.

Harlie answered 24/3, 2016 at 22:14 Comment(3)
This works for me, but I am at a bit of a loss to understand where MongoDB\BSON\ObjectID comes from. It's not defined anywhere in the vendor/mongodb folder as a separate class, as far as I can see. NetBeans is normally good at project introspection, but it can't see it either. And yet it works!Dietary
Thanks you so much man. Really Appreciate. Your are Start for me.Nowicki
For me new \MongoDB\BSON\ObjectID( idToken )] worked for me, notice the "\". Hope this helps someone.Maes
G
4

For MongoDB\Driver\Manager, a modern version of a MongoDB, you might consider the following working code:

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

For testing purposes:

foreach ($docs as $doc) {
  print_r($doc);
  //or you can: echo "$doc->item  $row->qty  $row->status<br />";
}
Guib answered 4/11, 2018 at 21:14 Comment(0)
K
1

With alcaeus/mongo-php-adapter (under php 7), needed to convert \MongoId to BSON type:

$filter = [];
$filter['_id'] = (new \MongoId('4e49fd8269fd873c0a000000'))->toBSONType();
$cursor = $collection->find($filter);
Kinghood answered 5/3, 2018 at 15:1 Comment(2)
with php 8 how to use a custom oid instead of the default mongodb one ? like "ABCD" php -version PHP 8.0.11 (cli) (built: Sep 23 2021 22:04:56) ( NTS ) Copyright (c) The PHP Group Zend Engine v4.0.11, Copyright (c) Zend Technologies with Zend OPcache v8.0.11, Copyright (c), by Zend Technologies # php --ri mongodb | grep version MongoDB extension version => 1.10.0 libbson bundled version => 1.18.0 libmongoc bundled version => 1.18.0 libmongocrypt bundled version => 1.2.1Discontinuity
ERROR:MongoDB\Driver\Exception\InvalidArgumentException: Error parsing ObjectId string: 0F000001Discontinuity

© 2022 - 2024 — McMap. All rights reserved.