sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cuál es el número máximo de parámetros pasados ​​a $in query en MongoDB?

La consulta en sí misma es un documento . MongoDB limita el tamaño de los documentos (a partir de la versión 2.4.0+) a 16 MB.

Realmente, lo que estás haciendo con un hallazgo es:

db.collectionName.find(queryDoc)

donde 'queryDoc' es algo como:

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

Para encontrar la cantidad máxima de valores que puede pasar a una consulta $in, use el 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

Entonces, puede ver que cada entero adicional tiene un tamaño de 11 bytes. No 11 bits, 11 BYTES. Esto se debe a la forma en que BSON almacena internamente números de al menos 64 bits cada uno, más el envoltorio. Esto se puede ver fácilmente con:

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

Por lo tanto, no importa cuál sea el tamaño de un número individual, es el mismo bsonsize.

En cuanto a la pregunta en sí:¿Qué tan grande es ese documento de consulta?

Sumando estos para una consulta de un campo con una cláusula $in, en pymongo, a través del indicador de javascript de mongos, lo que sea, todos arrojan los mismos hechos de suma para el tamaño máximo de una consulta $in:

mongos> Object.bsonsize({ 'a' : { '$in' : [1] }})
34
mongos> Object.bsonsize({ '' : { '$in' : [1] }})
33
mongos> Object.bsonsize({ '' : { '$in' : [] }})
22
  • El documento de consulta en sí tiene 22 bytes;
  • Cada byte del nombre del campo agrega un solo byte;
  • Cada número agregado a la cláusula $in agrega 11 bytes.

Entonces, suponiendo que tiene un nombre de campo de un byte (el mínimo, en realidad), su máximo es:

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

LA RESPUESTA:1.525.198 (Eso es 1,5 millones. Eso es bastante grande).