Должен ли я использовать $ in для выполнения запроса в MongoDB? - PullRequest
1 голос
/ 02 декабря 2011

Рассмотрим следующую структуру данных в коллекции:

{
_id : ObjectId("4ec6c015482c4c8302000001"),
uid : ObjectId("4ec6c015482c4c8302003233") //reference to user's Object ID
someValue : some json object,
}

Указанная коллекция будет очищена от uid.

Между этими двумя ситуациями, что было бы более производительным для чтения?

Вариант А)

Сохранить Ссылки на каждую структуру данных в объекте users и выполнить этот запрос:

db.collection.find({_id: {$in: ids}}

Вариант B)

Создайте индекс для uid и сделайте запрос следующим образом:

db.collection.find({uid : ObjectId("4ec6c015482c4c8302003233")})

каждый набор результатов будет включать 0-20 структур данных из коллекции.

Суммировано: Будет ли быстрее найти () 20 конкретных идентификаторов или все объекты, которые соответствуют индексируемому значению идентификатора (результирующий набор также равен 20)

Ответы [ 3 ]

2 голосов
/ 02 декабря 2011

Вариант (B) лучше и понятнее:

i) Вам не нужно хранить ссылки на _ids отдельно.

ii) Если для uid существует индекс, ваш запрос будет быстрым, оптимизация не требуется.

iii) Другие операции, такие как sort, limit, findOne, будут работать в основном синтаксисе. С опцией (A) вам придется всегда получать целые данные и выполнять операции с ними.

2 голосов
/ 02 декабря 2011

создайте индекс для uid, и ответ будет просто таким:

      uid    V.S.   _id  _id  _id 
      /|\            |    |    |
  doc doc doc       doc  doc  doc

чем больше _ids вы вставляете в запрос, тем больше проверяет _id, что означает дополнительный ввод / вывод.и время загрузки документа одинаковое.

0 голосов
/ 02 декабря 2011

Если вы выберете вариант А) и не будете иметь индекс, вариант Б) будет более производительным.Даже трудно, если бы все данные были полностью в памяти, более эффективно использовать B) (поскольку приложение должно сравнивать только одно значение, а не несколько).

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