PHP Velho Oeste 2024

Класс MongoId

(PECL mongo >=0.8.0)

Внимание

Расширение, задающее этот класс, объявлено устаревшим. Вместо него используйте расширение MongoDB. Есть такие альтернативы:

Введение

Уникальный идентификатор, созданный для объектов базы данных. При добавлении записи в базу данных без поля _id, такое поле будет автоматически добавлено и инициализировано объектом MongoId. Если хранимые записи предположительно и так будут содержать уникальные поля, (такие как имя пользователя или отметку времени), возможно использовать их вместо поля _id , и это не будет изменено MongoId.

Экземпляры класса MongoId выполняют роль автоинкремента реляционных базах данных: обеспечивает кортеж уникальным ключом в случае отсутствия такового. Однако автоинкремент не очень хорошо работает с секционированными (sharded) базами данных, так как в таком случае невозможно обеспечить быстрый поиск следующего инкремента. Данный класс удовлетворяет требованиям к быстрой генерации значения, уникального в пределах секции.

Каждый MongoId состоит из 12 байт (преобразующихся в 24 шестнадцатеричных символа). Первые 4 байта занимает отметка времени, следующие 3 хеш имени хоста клиента, следующие 2 - последние 2 значащих байта идентификатора процесса исполнения скрипта, и последние 3 байта - автоинкрементное значение.

Объекты MongoIdмогуть быть сериализованы и десериализованы. Пример сериализованного значения:

C:7:"MongoId":24:{4af9f23d8ead0e1d32000000}

Обзор классов

MongoId {
public string $id = NULL ;
/* Методы */
public __construct ([ string|MongoId $id = NULL ] )
public static getHostname ( void ) : string
public getInc ( void ) : int
public getPID ( void ) : int
public getTimestamp ( void ) : int
public static isValid ( mixed $value ) : bool
public static __set_state ( array $props ) : MongoId
public __toString ( void ) : string
}

Поля

id
Поле содержит строчное представление объекта.

Замечание: Имя свойства начинается с символа $. К нему можно обратиться используя сложный синтаксис разбора переменных (т.е. $mongoId->{'$id'}).

Смотрите также

Документация MongoDB об » идентификаторах.

Содержание

  • MongoId::__construct — Создает новый идентификатор
  • MongoId::getHostname — Получает имя хоста, используемое для идентификаторов этой машины
  • MongoId::getInc — Получает увеличенное значение для создания этого идентификатора
  • MongoId::getPID — Получает идентификатор процесса
  • MongoId::getTimestamp — Получает количество секунд с момента создания этого идентификатора
  • MongoId::isValid — Проверяет, является ли значение корректным ObjectId
  • MongoId::__set_state — Создает фиктивный MongoId
  • MongoId::__toString — Возвращает шестнадцатеричное представление этого идентификатора
add a note add a note

User Contributed Notes 7 notes

up
8
Lionel
10 years ago
Just to be careful with the strict comparison. Object inequalities holds.

<?php

$m1
= new MongoId('51b14c2de8e185801f000006');
$m2 = new MongoId('51b14c2de8e185801f000006');

var_dump($m1 === $m2); //gives you boolean false
var_dump($m1 == $m2); //gives you boolean true

$m3 = new MongoId('51b14c2de8e185801f000006');
$m4 = new MongoId('51b14c2de8e185801f000007');

var_dump($m3 === $m4); //gives you boolean false
var_dump($m3 == $m4); //gives you boolean false

?>
up
7
rmarscher
11 years ago
You can also cast the id to a string rather than access the $id property to get a string representation of the MongoId.

<?php
$stringId
= (string) $mongoId;
?>
up
5
georgedot dont spam me gmail caom
10 years ago
Due to Recent changes.

* [PHP-554] - MongoId should not get constructed when passing in an invalid ID.

Constructor will throw an exception when passing invalid ID.

<?php

$_id
= new MongoId(); //Generates new ID
$_id = new MongoId(null); //Generates new ID

$_id = new MongoId("invalid id"); //throws MongoException

?>

<?php
//Revert to old behaviour
$_id = "invalid id";
try {
   
$_id = new MongoId($_id);
} catch (
MongoException $ex) {
   
$_id = new MongoId();
}
?>

<?php
//Nifty hack
class SafeMongoId extends MongoId {

    public function
__construct($id=null) {

        try {
           
parent::__construct($id);
        } catch (
MongoException $ex) {
           
parent::__construct(null);
        }

    }
}
?>
up
2
Ryan S
11 years ago
it is important to note that

<?php
   
array("_id" => new MongoId("50cf7d2841d41f4f35000000"))
//                   ≠
   
array("_id" => array("$id" => "50cf7d2841d41f4f35000000"))
?>

This issue can arrise when using json_encode() and json_decode(). If not paying close enough attention one can assume due to the encoded value of the object that it is just this simple:

<?php
    $item
= $db->myCollection->findOne();
    print
json_encode($item);
   
// {"_id": {"$id": "50cf7d2841d41f4f35000000"}}
   
$item = $db->myCollection->findOne(json_encode($item));
   
// $item is empty aka not found
?>

Simple solution to handle these situations:

<?php
   
class MongoId2 extends MongoId {
        public function
__construct($id = null) {
            if(
is_array($id)) {
               
$id = (object) $id;
            }

            if(
is_object($id) && isset($id->{'$id'})) {
               
$id = $id->{'$id'};
            }

            return
parent::__construct($id);
        }
    }
?>
up
2
lensvil dot co at gmail dot com
7 years ago
Get ObjectId MongoDB via PHP

var_dump($object);

object(MongoDB\Model\BSONDocument)#36 (1) {
  ["storage":"ArrayObject":private]=>
  array(8) {
    ["_id"]=>
    object(MongoDB\BSON\ObjectID)#33 (1) {
      ["oid"]=>
      string(24) "573e69e78fccd968aa066611"
    }
    ["dummy"]=>
    string(5) "mongo"
  }
}

Failure
var_dump($object->_id->oid);
>>> null

var_dump($object->_id->{'oid'});
>>> null

var_dump($object->_id->{'$oid'});
>>> null

Success
$bson = \MongoDB\BSON\fromPHP($object);
$json = \MongoDB\BSON\toJSON($bson);
$result = json_decode($json, true);

var_dump($result['_id']['$oid']);
>>> string(24) "573e69e78fccd968aa066611"
exit;
up
2
sararschreiber at gmail dot com
13 years ago
this is useful for querying for an object by id, given the id's hex:

<?php
$userid
= '4cb4ab6d7addf98506010000';

$theObjId = new MongoId($userid);

$connection = new Mongo();
$db = $connection->thedb->users;

// this will return our matching entry.
$item = $db->findOne(array("_id" => $theObjId));

$connection->close();

?>
up
2
alex dot turpin at gmail dot com
12 years ago
If you need to get the actual ID string, and you try the usual way, PHP will whine because it starts with a dollar sign and it thinks it's a variable. Instead, use this notation:

<?php
    $mongoid
->{'$id'} //Get the $id property of a MongoId object
?>
To Top