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

MongoDB中在查询中传递给$in的最大参数数是多少?,mongodb,Mongodb,MongoDB中在查询中传递给$的最大参数数是多少?看起来没有限制 我做了一个小测试 1) 集合A有-100万个简单JSON对象{id:,name:} 2) 在集合B中,我加载了集合A的引用ID,直到得到以下异常。我最多可以插入450k的参考计数 Exception in thread "main" com.mongodb.MongoInternalException: DBObject of size 18388885 is over Max BSON size 16777216 3) 我可

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

看起来没有限制

我做了一个小测试

1) 集合A有-100万个简单JSON对象{id:,name:}

2) 在集合B中,我加载了集合A的引用ID,直到得到以下异常。我最多可以插入450k的参考计数

Exception in thread "main" com.mongodb.MongoInternalException: DBObject of size 18388885 is over Max BSON size 16777216
3) 我可以以$in[id1…id450000]的形式发送这些ID中的450k,并从集合A中的100万个对象中提取整个450k ID列表


哇!这对于我的应用程序来说已经足够了:D.MongoDB真的很酷

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

就性能而言,根据我的发现,$In子句中的值数量有一个“最佳点”。请参见我在这一相关问题中的回答:


i、 e.平衡$in子句中的值数量与发送的查询数量。我正在浏览一篇关于这方面的博文,试图深入了解更多细节。

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

真的,你要做的是:

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字节。这是由于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
所以,无论单个数字的大小,它都是相同的大小

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

在pymongo中,通过mongos javascript提示符将这些添加到一个带有$in子句的单字段查询中,不管怎样,对于一个最大大小为$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

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

我正在寻找一个答案,以确认在in子句中可以传递多少UUID。因此,发布结果只是为了以防万一,如果它有助于其他人

我试图通过500个UUID,如下所示:

 Object.bsonsize({ 'fieldOne' : { $in : [ 
    "3bd209e1-41c9-4ad2-a62c-bbe3d2ae490a",
    "3bd209e1-41c9-4ad2-a62c-bbe3d2ae490a",
    "3bd209e1-41c9-4ad2-a62c-bbe3d2ae490a".
     ..
     ..] } })

结果是:23518

我在某个地方读到它是1000 000。下面是实际计算和显示的工作量。