(PECL mongo >=1.0.4)
MongoCursor::addOption — Добавляет пару ключ/значение верхнего уровня в запрос
Это расширенная функция, и ее нельзя использовать, если вы не знаете, что делаете.
Запрос может быть дополнительно вложен в поле "query", если заданы другие параметры, такие как сортировка или подсказка. Например, добавление сортировки приведет к тому, что запрос становится подполем более крупного объекта запроса, например:
<?php
$query = array("query" => $query, "orderby" => $sort);
?>
Этот метод предназначен для добавления поля верхнего уровня в запрос. Это делает запрос подобъектом (если это еще не сделано) и добавляет пару ключ/значение по вашему выбору на верхний уровень.
Его нельзя использовать для добавления дополнительных критериев к запросу на лету. Например, это не будет работать:
<?php
// НЕ ПРАВИЛЬНО
$cursor = $users->find()->addOption("name", "joe")->addOption("age", 20);
?>
key
Имя поля для добавления.
value
Значение для добавления.
Возвращает курсор.
Выдает исключение MongoCursorException, если этот курсор начал итерацию.
Пример #1 Пример использования MongoCursor::addOption() для добавления комментария
MongoDB поддерживает специальные опции для отправки на сервер. Оболочка использует опцию _addSpecial для отправки $comment на сервер. Этот комментарий будет отображаться в журнале профилирования (например, для медленных запросов). В драйвере PHP вы используете метод MongoCursor::addOption().
<?php
$m = new MongoClient;
$c = $m->demo->demo;
$cursor = $c->find();
$cursor->addOption('$comment', "Этот комментарий будет отображаться в журнале профилирования");
foreach ($cursor as $document) { /* пусто */ }
?>
Результатом выполнения данного примера будет что-то подобное:
{ "op" : "query", "ns" : "demo.demo", "query" : { "$query" : { }, "$comment" : "Этот комментарий будет отображаться в журнале профилирования" }, "cursorid" : 168463566447, "ntoreturn" : 0, "ntoskip" : 0, "nscanned" : 101, "nscannedObjects" : 101, "keyUpdates" : 0, "numYield" : 0, …
Пример #2 Пример использования MongoCursor::addOption()
Использование MongoCursor::skip() для пропуска миллионов результатов может стать медленным. Одним из способов решения этой проблемы является использование параметров $min или $max для запроса. Это может быть удобно, но для них требуется указатель именно на искомые поля. Это пример того, как использовать $min в качестве альтернативы MongoCursor::skip().
<?php
// убедитесь, что у нас есть индекс
$c->ensureIndex(array("ts" => 1));
// вам, возможно, придется изменить это, чтобы запускаться
// в разумные сроки на медленных машинах (на хорошей машине это может занять около 30 секунд)
for ($i = 0; $i < 30000000; $i++) {
$c->insert(array("ts" => new MongoDate(), "i" => $i));
}
$now = strtotime("now");
// найти документы, вставленные за последние 2 секунды
$cursor = $c->find()->addOption('$min', array("ts" => $now-2));
?>