MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Qual é o número máximo de parâmetros passados ​​para a consulta $in no MongoDB?


A consulta em si é um documento . O MongoDB limita os tamanhos dos documentos (a partir da versão 2.4.0+) a 16 MB.

Na verdade, o que você está fazendo com um achado é:
db.collectionName.find(queryDoc)

onde 'queryDoc' é algo como:
{ 'fieldOne' : { $in : [ 1, 2, 3, 4] } }

Para encontrar o número máximo de valores que você pode passar para uma consulta $in, use o bsonsize comando:
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

Assim, você pode ver que cada inteiro adicional tem 11 bytes de tamanho. Não 11 bits, 11 BYTES. Isso se deve à maneira como o BSON armazena internamente os números com pelo menos 64 bits cada, mais o wrapper. Isso pode ser facilmente visto com:
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

Então, não importa o tamanho de um número individual, é o mesmo bsonsize.

Para a pergunta em si:qual é o tamanho desse documento de consulta?

Adicionando-os para uma consulta de um campo com uma cláusula $in, em pymongo, através do prompt javascript do mongos, qualquer que seja, todos produzem os mesmos fatos de adição para o tamanho máximo de uma consulta $in:
mongos> Object.bsonsize({ 'a' : { '$in' : [1] }})
34
mongos> Object.bsonsize({ '' : { '$in' : [1] }})
33
mongos> Object.bsonsize({ '' : { '$in' : [] }})
22
  • O próprio documento de consulta tem 22 bytes;
  • Cada byte do nome do campo adiciona um único byte;
  • Cada número adicionado à cláusula $in adiciona 11 bytes.

Então, supondo que você tenha um nome de campo de um byte (o mínimo, na verdade), seu máximo é:
mongos> 16*1024*1024
16777216
mongos> (16*1024*1024) - 22 - 1 
16777193
mongos> ((16*1024*1024) - 22 -1) / 11
1525199.3636363635

A RESPOSTA:1.525.198 (Isso é 1,5 milhão. Isso é muito grande.)