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.)