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

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

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

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

db.collectionName.find(queryDoc) 

其中“queryDoc”是这样的:

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

要查找可以传递给$ in查询的最大数量的值,请使用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内部存储数字的方式,每个数字至less为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 

所以,不pipe个别号码的大小是多less,都是一样的。

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

用$ in子句,在pymongo中,通过mongos javascript提示符,把所有这些添加到一个字段查询中,无论如何,所有的$ in查询的最大大小都是相同的加法事实:

 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 

答案:1,525,198 (那是150万,这相当大)

看起来没有限制。

我做了一个小testing。

1)集合A有 – 1百万个简单的JSON对象{id:,name:}

2)在B集合中,我加载了集合A的引用ID,直到出现以下exception。 我可以插入最多450k的引用计数。

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

3)我可以在[id1 … id450000]中发送450k这些id,并从集合A中的100万个对象中拉出450k id的整个列表。

哇! D.对于我的应用程序来说,这样做更多:D。 MongoDB真的很酷。

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

就性能而言,从我所发现的情况来看,$ in子句中的值的数量有一个“甜蜜点”。 在这个相关的问题中查看我的答案: 每个请求可以多次查询MongoDB吗?

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