2011-03-16 59 views
47

在MongoDB查询中传递给$的参数的最大数量是多少?

+0

我在某处读到它是1 000 000. – oyatek 2012-01-28 12:55:35

+0

请参阅下面的实际计算并显示工作。 – 2013-08-28 18:26:20

回答

33

看起来没有限制。

我做了一个小测试。

1)集合将有 - 1个百万简单的JSON对象{ID:姓名:}

2)在集合B中,我装集合A的参考IDS,直到我得到了以下异常。我可以插入最大值为450k的引用计数。

Exception in thread "main" com.mongodb.MongoInternalException: DBObject of size 18388885 is over Max BSON size 16777216 

3)我可以在[ID1 ... id450000]发送这些ID为$ 45万的在收集A.从1个亿个对象拉450K ID的整个列表

哇!这对我的应用程序来说更加绰绰有余:D。 MongoDB真的很酷。

+3

+1有趣的实验 – Danimal 2011-03-21 23:57:31

6

我认为这个限制是由BSONDocument的大小决定的。定义查询时,您可以继续向$ in子句中添加值,直到超过最大文档大小。因此,在子句中可以有多少值取决于每个值的大小(每个值的大小越小,可以包含在$ in子句中的越多)。

就性能而言,从我发现的结果来看,$ in子句中值的数量有一个“最佳点”。请参阅我在此相关问题中的回答:Is it OK to query a MongoDB multiple times per request?

即平衡$ in子句中值的数量与发送查询的数量。我正在通过一篇博客文章的中途尝试并深入了解更多细节。

53

查询本身是一个文件。 MongoDB将文档大小(从版本2.4.0+开始)限制为16 MB。

真的,什么你和一个发现做的是:

db.collectionName.find(queryDoc) 

其中“queryDoc”是一样的东西:

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

要发现你可以传递给值的最大数量$在查询,使用bsonsize命令:

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 

所以,你可以看到每个额外的整数大小为11个字节。不是11位,11个BYTES。这是由于BSON内部存储数字的方式,每个数字至少为64位,外加封装。这可以很容易地看到:

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 

所以,不管个别号码的大小,它是相同的bsonsize。

对问题本身:查询文档有多大?

加上这些与在第一个$一个字段查询,请在pymongo,通过mongos JavaScript的提示,不管,一切一代产量为$的最大大小相同的另外的事实查询:

mongos> Object.bsonsize({ 'a' : { '$in' : [1] }}) 
34 
mongos> Object.bsonsize({ '' : { '$in' : [1] }}) 
33 
mongos> Object.bsonsize({ '' : { '$in' : [] }}) 
22 
  • 查询文件本身是22个字节;
  • 字段名称的每个字节都添加一个字节;
  • 添加到$ in子句中的每个数字都会添加11个字节。

所以,假设你有一个字节的字段名(最小,真的),您最大的是:

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

答案:(。这是150万这是相当大的)1525198

相关问题