Ответ 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 миллиона. Это довольно большой.)