MongoCollection findOne vs find - PullRequest
       3

MongoCollection findOne vs find

0 голосов
/ 31 октября 2011

Я хотел бы знать, есть ли какое-то улучшение по MongoCollection::findOne или это просто "псевдоним" или "сокращение" до MongoCollection::find с пределом 1, например.

Спасибо

Ответы [ 6 ]

5 голосов
/ 01 ноября 2011

findOne() - псевдоним find() с limit(-1)

Вы можете увидеть это в исходном коде здесь . Это эквивалентно

find(...).limit(-1).getNext().

-1 действительно актуально. Вот фрагмент из протокола проводной связи :

Если число отрицательное, то база данных вернет это число и закройте курсор.

Если вы зайдете в оболочку и наберете > db.collection.findOne (без паренов) , вы увидите, что функция также является просто помощником в оболочке.

Итак, "да findOne() - это просто помощник" .

2 голосов
/ 31 октября 2011

Из mongo tutorials ...

Чтобы показать, что документ, который мы вставили на предыдущем шаге, есть, мы можем выполнить простую операцию findOne (), чтобы получитьпервый документ в коллекции.Этот метод возвращает один документ (а не DBCursor, который возвращает операция find ()), и он полезен для вещей, где есть только один документ или вас интересует только первый.Вам не нужно иметь дело с курсором.

1 голос
/ 01 ноября 2011

mongodb.org имеет отчет о тестировании производительности , где они сравнивали findOne и find.Исходя из результатов, кажется, что findOne на 35-45% быстрее.

Несколько точек данных из отчета:

  • find_one (маленький, без индекса): 989 операций / с
  • поиск (маленький, без индекса): 554 операции/ s
1 голос
/ 31 октября 2011

Метод MongoCollection::findOne напрямую возвращает массив результатов, а метод MongoCollection::find возвращает экземпляр MongoCursor, даже если это однозначный результат.

0 голосов
/ 31 октября 2011

Это зависит от вашего поискового запроса.Например, если вы выполняете поиск по идентификатору, поскольку идентификатор уникален, ему не нужно ограничивать результаты, поскольку будет найден только один результат.Если найдено более одной записи, результаты будут ограничены на 1. Другое отличие состоит в том, что findOne возвращает массив, а find возвращает mongoCursor.

0 голосов
/ 31 октября 2011

Это почти как псевдоним, но вместо того, чтобы вернуть вам список, он возвращает вам объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...