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

Dee*_*pan 62 mongodb

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

Kev*_*ice 90

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

真的,你在寻找的是:

db.collectionName.find(queryDoc)
Run Code Online (Sandbox Code Playgroud)

其中'queryDoc'是这样的:

{ 'fieldOne' : { $in : [ 1, 2, 3, 4] } }
Run Code Online (Sandbox Code Playgroud)

要查找可以传递给$ 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
Run Code Online (Sandbox Code Playgroud)

因此,您可以看到每个额外的整数大小为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
Run Code Online (Sandbox Code Playgroud)

因此,无论单个数字的大小如何,它都是相同的bsonsize.

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

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

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

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

mongos> 16*1024*1024
16777216
mongos> (16*1024*1024) - 22 - 1 
16777193
mongos> ((16*1024*1024) - 22 -1) / 11
1525199.3636363635
Run Code Online (Sandbox Code Playgroud)

回答:1,525,198 (那是150万.这个很大.)

  • 这个答案应该是公认的。 (2认同)

Dee*_*pan 35

看起来没有限制.

我做了一个小测试.

1)集合A有--1万个简单的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
Run Code Online (Sandbox Code Playgroud)

3)我可以在[id1 ... id450000]中以$ $的形式发送450k这些ID,并从集合A中的1百万个对象中提取450k ID的完整列表.

哇!这对我的应用来说已经足够了:D.MongoDB非常酷.


Ada*_*Dev 7

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

就性能而言,从我发现的内容来看,$ in子句中的值的数量有一个"最佳点".请参阅我在这个相关问题中的答案:每次请求多次查询MongoDB是否可以?

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