MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Qual è il numero massimo di parametri passati alla query $in in MongoDB?

La query stessa è un documento . MongoDB limita le dimensioni dei documenti (a partire dalla versione 2.4.0+) a 16 MB.

In realtà, quello che stai facendo con una ricerca è:

db.collectionName.find(queryDoc)

dove 'queryDoc' è qualcosa del tipo:

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

Per trovare il numero massimo di valori che puoi passare a una query $in, utilizza 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

Quindi, puoi vedere che ogni numero intero aggiuntivo ha una dimensione di 11 byte. Non 11 bit, 11 BYTE. Ciò è dovuto al modo in cui BSON memorizza internamente i numeri come almeno 64 bit ciascuno, più il wrapper. Questo può essere facilmente visto 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

Quindi, non importa quale sia la dimensione di un singolo numero, è la stessa bsonsize.

Passiamo alla domanda stessa:quanto è grande quel documento di query?

Sommandoli per una query su un campo con una clausola $in, in pymongo, tramite il prompt di javascript mongos, qualunque cosa, si ottengono tutti gli stessi fatti di addizione per la dimensione massima di una query $in:

mongos> Object.bsonsize({ 'a' : { '$in' : [1] }})
34
mongos> Object.bsonsize({ '' : { '$in' : [1] }})
33
mongos> Object.bsonsize({ '' : { '$in' : [] }})
22
  • Il documento della query stesso è di 22 byte;
  • Ogni byte del nome del campo aggiunge un singolo byte;
  • Ogni numero aggiunto alla clausola $in aggiunge 11 byte.

Quindi, supponendo che tu abbia un nome di campo di un byte (il minimo, in realtà), il tuo massimo è:

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

LA RISPOSTA:1.525.198 (Sono 1,5 milioni. È abbastanza grande.)