2011-11-21 1 views
30

Я знаю, что MongoDB способен обрабатывать множество запросов/сек, но скажем, мне нужно запросить много документов коллекции, учитывая их _id; что звучит лучше: сделать $ in в атрибуте _id со всеми идентификаторами, которые я хочу получить, или запросить запросы findOne?

ответ

32

Я бы определенно воспользовался запросом $ in и предоставил массив _ids.

Пример:

db.collection.find({ 
    "key": { 
     "$in": [ 
      ObjectId("xxx"), 
      ObjectId("yyy"), 
      ObjectId("zzz") 
     ] 
    } 
}) 

Почему?

  • Если вы зацикливаете, для каждого запроса создаются и исчерпываются курсоры, которые создают накладные расходы.
  • Если вы не делаете этого на локальном компьютере, он также создает накладные расходы tcp/ip для каждого запроса. Локально вы можете использовать сокеты домена.
  • Созданный по умолчанию индекс «_id», и сбор группы документов для возврата в пакетном запросе должен быть чрезвычайно быстрым, поэтому нет необходимости разбивать это на более мелкие запросы.

Есть дополнительная документация here, если вы хотите ее проверить.

+8

Что делать, если в $ $ есть много предметов ... скажем 100 или 1000? – ewindsor

+0

@ewindsor все до 1000 обычно нормально. После этого я пересмотрю схему, которая у вас есть, и начните предварительную обработку данных. –

+1

может '$ in' использоваться в массиве объектов JSON? –