Penggunaan fungsi OBJECTID pada PHP

Ketika saya memasukkan beberapa dokumen ke dalam koleksi (tanpa ObjectID) mongoDB menambahkan ObjectIDnya sendiri.

Saya ingin meminta dokumen dengan ObjectID yang unik.

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

Ini tidak bekerja dengan awalan MongoID atau ObjectID di depan '4e49fd8269fd873c0a000000'.

Apa cara yang tepat untuk query oleh ObjectID dengan mongoDB di PHP?

Cukup yakin Anda harus menggunakan objek MongoId , mis

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

Catatan pada halaman Querying sedikit tumpul tetapi tidak menyebutkan ...

Kecuali jika pengguna telah menentukan sebaliknya, bidang _id adalah MongoId. Kesalahan yang paling umum adalah berusaha menggunakan string untuk mencocokkan MongoId. Perlu diingat bahwa ini adalah dua tipe data yang berbeda, dan tidak akan cocok satu sama lain dengan cara yang sama bahwa string "array ()" tidak sama dengan array kosong

Saya pikir sekarang perubahan API ke MongoDB\BSON\ObjectID, juga Anda dapat menggunakan [] untuk menunjukkan array dalam PHP 5.4+, jadi seharusnya:

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

berdasarkan jawaban Phil.

Untuk MongoDB\Driver\Manager, versi modern dari MongoDB, Anda dapat mempertimbangkan kode kerja berikut:

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

Untuk tujuan pengujian:

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

Dengan alcaeus/mongo-php-adapter (di bawah php 7), diperlukan untuk mengonversi \MongoId ke tipe BSON:

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

Dalam beberapa bab pertama kita telah menggunakan MongoDB objek Id (ObjectId).

Pada bagian ini, kita akan melihat struktur ObjectId.

ObjectId BSON adalah tipe data 12-byte, memiliki format berikut:

  • Pertama empat byte timestamp
  • Tiga byte berikutnya kode mesin adalah
  • Segera dua byte disusun oleh proses id (PID)
  • Tiga byte terakhir dari nomor acak.

dokumen MongoDB disimpan harus ada "_id" kunci. Nilai kunci ini dapat jenis, default adalah objek ObjectId.

Dalam satu set dalam setiap dokumen memiliki unik "_id" nilai, untuk memastikan koleksi dalam setiap dokumen dapat diidentifikasi secara unik.

MongoDB menggunakan ObjectId, tetapi pendekatan bukan alasan utama lain yang lebih konvensional (seperti kunci utama auto-increment), karena nilai kunci primer secara otomatis meningkat sinkronisasi di beberapa server juga memakan waktu dan tenaga.


Buat ObjectId baru

Gunakan kode berikut untuk menghasilkan ObjectId baru:

>newObjectId = ObjectId()

Pernyataan di atas mengembalikan berikut dihasilkan unik id:

ObjectId("5349b4ddd2781d08c09890f3")

Anda juga dapat menggunakan id yang dihasilkan bukan MongoDB secara otomatis ObjectId:

>myObjectId = ObjectId("5349b4ddd2781d08c09890f4")

dokumen penciptaan timestamp

Sejak ObjectId disimpan dalam empat byte dari waktu yang tertera, sehingga Anda tidak perlu menyimpan bidang timestamp untuk dokumen Anda, Anda dapat membuat waktu untuk mendapatkan dokumen dengan fungsi getTimestamp:

>ObjectId("5349b4ddd2781d08c09890f4").getTimestamp()

Kode di atas akan kembali saat ISO pembuatan dokumen Format:

ISODate("2014-04-12T21:49:17Z")

ObjectId dikonversi ke string

Dalam beberapa kasus, Anda mungkin perlu mengkonversi format string ObjectId. Anda dapat menggunakan kode berikut:

>new ObjectId().str

Kode di atas akan mengembalikan format string Guid ::

5349b4ddd2781d08c09890f3

The MongoDB\BSON\ObjectId class

(mongodb >=1.0.0)

Introduction

BSON type for an » ObjectId. The value consists of 12 bytes, where the first four bytes are a timestamp that reflect the ObjectId's creation. Specifically, the value consists of:

  • a 4-byte value representing the seconds since the Unix epoch,
  • a 5-byte random number unique to a machine and process, and
  • a 3-byte counter, starting with a random value.

In MongoDB, each document stored in a collection requires a unique _id field that acts as a primary key. If an inserted document omits the _id field, the driver automatically generates an ObjectId for the _id field.

Using ObjectIds for the _id field provides the following additional benefits:

  • The creation time of the ObjectId may be accessed using the MongoDB\BSON\ObjectId::getTimestamp() method.
  • Sorting on an _id field that stores ObjectId values is roughly equivalent to sorting by creation time.

Class synopsis

/* Methods */

final public unserialize(string $serialized): void

}

Table of Contents

  • MongoDB\BSON\ObjectId::__construct — Construct a new ObjectId
  • MongoDB\BSON\ObjectId::getTimestamp — Returns the timestamp component of this ObjectId
  • MongoDB\BSON\ObjectId::jsonSerialize — Returns a representation that can be converted to JSON
  • MongoDB\BSON\ObjectId::serialize — Serialize an ObjectId
  • MongoDB\BSON\ObjectId::__toString — Returns the hexidecimal representation of this ObjectId
  • MongoDB\BSON\ObjectId::unserialize — Unserialize an ObjectId

Mike T

4 years ago

Worth noting this will throw an InvalidArgumentException if string is not in the correct format