MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Quel est le nombre maximum de paramètres passés à la requête $in dans MongoDB ?

La requête elle-même est un document . MongoDB limite la taille des documents (à partir de la version 2.4.0+) à 16 Mo.

En réalité, ce que vous faites avec une recherche est :

db.collectionName.find(queryDoc)

où 'queryDoc' est quelque chose comme :

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

Pour trouver le nombre maximum de valeurs que vous pouvez transmettre à une requête $in, utilisez le bsonsize commande :

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

Ainsi, vous pouvez voir que chaque entier supplémentaire a une taille de 11 octets. Pas 11 bits, 11 OCTETS. Cela est dû à la façon dont BSON stocke en interne les nombres sur au moins 64 bits chacun, plus le wrapper. Cela peut être facilement vu avec :

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

Ainsi, quelle que soit la taille d'un numéro individuel, c'est la même bsonsize.

Passons à la question elle-même :quelle est la taille de ce document de requête ?

En les additionnant pour une requête à un champ avec une clause $in, dans pymongo, via l'invite javascript mongos, peu importe, tous produisent les mêmes faits d'addition pour la taille maximale d'une requête $in :

mongos> Object.bsonsize({ 'a' : { '$in' : [1] }})
34
mongos> Object.bsonsize({ '' : { '$in' : [1] }})
33
mongos> Object.bsonsize({ '' : { '$in' : [] }})
22
  • Le document de requête lui-même fait 22 octets ;
  • Chaque octet du nom du champ ajoute un seul octet ;
  • Chaque nombre ajouté à la clause $in ajoute 11 octets.

Donc, en supposant que vous ayez un nom de champ d'un octet (le minimum, vraiment), votre maximum est :

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

LA RÉPONSE :1 525 198 (C'est 1,5 million. C'est assez gros.)