Каково максимальное количество параметров, переданных в запрос запроса в MongoDB? - программирование
Подтвердить что ты не робот

Каково максимальное количество параметров, переданных в запрос запроса в MongoDB?

Каково максимальное количество параметров, переданных в запрос запроса в MongoDB?

4b9b3361

Ответ 1

Сам - это документ. MongoDB ограничивает размеры документов (начиная с версии 2.4.0+) до 16 МБ.

Действительно, что вы делаете с поиском:

db.collectionName.find(queryDoc)

где 'queryDoc' выглядит примерно так:

{ 'fieldOne' : { $in : [ 1, 2, 3, 4] } }

Чтобы найти максимальное количество значений, которые вы можете передать в запрос $, используйте команду bsonsize:

mongos> Object.bsonsize([1])
16
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4] } })
74
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5] } })
85
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6] } })
96

Итак, вы можете видеть, что каждое дополнительное целое число составляет 11 байтов. Не 11 бит, 11 байт. Это связано с тем, что BSON внутренне хранит номера как минимум по 64 бита, плюс оболочку. Это можно легко увидеть с помощью

mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 69000] } })
107
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 6900000] } })
107
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 69000000000] } })
107
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 69000000000000] } })
107
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 6900000000000000] } })
107
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 690000000000000000] } })
107
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 69000000000000000000] } })
107
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 6900000000000000000000] } })
107
mongos> Object.bsonsize({ 'fieldOne' : { $in : [ 1, 2, 3, 4, 5, 6, 69000000000000000000000000] } })
107

Таким образом, независимо от размера индивидуального номера, это одно и то же bsonsize.

На вопрос: насколько велик этот документ запроса?

Добавьте их для одного запроса поля с предложением $in, в pymongo, через подсказку javascript mongos, независимо от того, все ли вы делаете те же самые дополнительные факты для максимального размера запроса $:

mongos> Object.bsonsize({ 'a' : { '$in' : [1] }})
34
mongos> Object.bsonsize({ '' : { '$in' : [1] }})
33
mongos> Object.bsonsize({ '' : { '$in' : [] }})
22
  • Сам документ запроса составляет 22 байта;
  • Каждый байт имени поля добавляет один байт;
  • Каждый номер, добавленный в предложение $in, добавляет 11 байтов.

Итак, Предположим, что у вас однобайтовое имя поля (минимальное, действительно), ваш максимум:

mongos> 16*1024*1024
16777216
mongos> (16*1024*1024) - 22 - 1 
16777193
mongos> ((16*1024*1024) - 22 -1) / 11
1525199.3636363635

ОТВЕТ: 1,525,198 (Это 1,5 миллиона. Это довольно большой.)

Ответ 2

Похоже, нет никаких ограничений.

Я сделал небольшой тест.

1) В коллекции A был - 1 миллион простого объекта JSON {id:, name:}

2) В сборнике B я загрузил ссылочные идентификаторы коллекции A, пока не получил следующее исключение. Я мог бы вставить счетчик ссылок 450 тыс. Макс.

Exception in thread "main" com.mongodb.MongoInternalException: DBObject of size 18388885 is over Max BSON size 16777216

3) Я мог бы отправить 450k этих идентификаторов в $в [id1... id450000] и вытащить весь список из 450 тысяч идентификаторов из 1 миллиона объектов в коллекции A.

Ничего себе! это более чем достаточно для моего приложения: D. MongoDB действительно круто.

Ответ 3

Я думаю, что ограничение определяется только размером BSONDocument. Когда вы определяете запрос, вы можете продолжать добавлять значения в предложение $in, пока не превысите максимальный размер документа. Итак, сколько значений, которые вы можете иметь в предложении, зависит от того, насколько велико каждое значение (чем меньше размер каждого значения, тем больше вы можете включить в предложение $in).

С точки зрения производительности, из того, что я нашел, есть "сладкое пятно" для количества значений в статье $in. См. Мой ответ в этом связанном вопросе: Можно ли запросить MongoDB несколько раз за запрос?

то есть. балансировочное число значений в позиции $in и количество отправленных запросов. Я нахожусь в середине сообщения в блоге, чтобы попытаться погрузиться в более подробные сведения.