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

标签 mongodb

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

最佳答案

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

真的,你对 find 所做的是:

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

所以,无论单个数字的大小,它都是相同的 bsonsize。

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

在 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

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

关于mongodb - 在 MongoDB 中传递给 $in 查询的最大参数数是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5331549/

相关文章:

javascript - 如何查询 MongoDB 的 2 个范围和文本搜索?

java - micronautreactive-mongo 设置内部服务器错误

node.js - 带有嵌套可选对象和必填字段的 Mongoose 模式

php - MongoDB、数组存储和对象查询

mongodb - 如何在mongodb中转换日期格式

javascript - 在 meteor 中使用 mongodb 将函数存储在数据库中

javascript - 如何在strongloop环回中使用mongoDB的提示运算符?

node.js - 使用nodejs构建多级菜单

java - 摆脱 MongoDB 对 JSON 格式的扩展

ruby - 如何等待生成的进程