sql >> Databasteknik >  >> NoSQL >> MongoDB

Vilket är det maximala antalet parametrar som skickas till $in-frågan i MongoDB?

Själva frågan är ett dokument . MongoDB begränsar dokumentstorlekar (från och med version 2.4.0+) till 16 MB.

Det du verkligen gör med ett fynd är:

db.collectionName.find(queryDoc)

där 'queryDoc' är något i stil med:

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

För att hitta det maximala antalet värden du kan skicka till en $in-fråga, använd bsonsize kommando:

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

Så du kan se att varje ytterligare heltal är storleken 11 byte. Inte 11 bitar, 11 BYTE. Detta beror på hur BSON internt lagrar nummer som minst 64 bitar vardera, plus omslaget. Detta kan enkelt ses med:

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

Så, oavsett storleken på ett enskilt nummer, är det samma bsonstorlek.

Åter till själva frågan:Hur stort är det frågedokumentet?

Att lägga till dessa för en ettfältsfråga med en $in-sats, i pymongo, genom mongos javascript-prompt, vad som helst, ger alla samma tilläggsfakta för den maximala storleken på en $in-fråga:

mongos> Object.bsonsize({ 'a' : { '$in' : [1] }})
34
mongos> Object.bsonsize({ '' : { '$in' : [1] }})
33
mongos> Object.bsonsize({ '' : { '$in' : [] }})
22
  • Själva frågedokumentet är 22 byte;
  • Varje byte i fältnamnet lägger till en enda byte;
  • Varje nummer som läggs till i $in-satsen lägger till 11 byte.

Så, förutsatt att du har ett fältnamn på en byte (minsta, egentligen), är ditt maximum:

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

SVARET:1 525 198 (Det är 1,5 miljoner. Det är ganska stort.)



  1. MongoDB loggar alla frågor

  2. Hämta BinData UUID från Mongo som sträng

  3. MongoDB $type Aggregation Pipeline Operator

  4. Resque på Heroku cedar stack Antalet arbetare existerar fortfarande efter att arbetaren avslutats