MongoDB 2.6 服务器对低于限制的查询抛出 'BSONObj size is invalid' 错误

标签 mongodb mongodb-query

我一直在尝试从 MongoDB 2.4 升级到 2.6,唯一阻碍我的是这种非常奇怪的行为。当使用相当大的查询〜6MB查询mongod 2.4时,我没有问题 - 查询完成得很好(即使下面的数据是生成的并且是假的,我已经用有效数据进行了测试并且查询完成了)。查询具有相同数据的 mongod 2.6 实例时,出现错误:

error: {
     "$err" : "BSONObj size: 16828982 (0x100CA36) is invalid. Size must be between 0 and 16793600(16MB)",
     "code" : 10334
}

但是,我的传入查询远不及 16MB,而且我可以测试不同大小的传出结果 - 没有变化。请注意,这只发生在查询 ObjectId 类型的字段时。

引用资料:

为什么 2.6 会错误地判断传入查询的大小,我该怎么办?

我的一个理论是,shell 和服务器查看 ObjectId 的方式存在一些差异,因此在服务器上相同的查询更大......


无关紧要的事情:

  • monogdb 客户端版本
  • 2.6.X 版本 - 我测试过 2.6.1 - 2.6.3
  • 查询是否返回数据(即我可以尝试将 _id 与假 id 或真实 id 进行匹配,没有区别)
  • 如果我们在 shell 中使用 ObjectId 或不使用(参见 big_20_with_obj.json,使用 echo 行创建:echo "ObjectId(\"12345123451234512 $i\"),")

重要的事情:

  • mongod版本是2.6.X2.4.10 及以下不受影响
  • 如果我们正在查询 ObjectId 字段
  • 如果集合存在(又名 db.randomfakecollection.find({'_id': {'$in': big}}) 不会抛出错误)
  • 如果我们使用 $in 运算符 - $eq 不会抛出

如何复制:

如何创建大文件:

echo 'var big = [' >> big_20.json
for i in {300000..520000}; do
  echo "\"123451234512345123$i\"," >> big_20.json
done;
echo "];" >> big_20.json

原始文件的大小:

$ ls -lh
-rw-rw-r--  1 ubuntu ubuntu 5.8M Jul  2 17:35 big_15.json
-rw-rw-r--  1 ubuntu ubuntu 5.9M Jul  2 17:35 big_20.json
-rw-rw-r--  1 ubuntu ubuntu 8.0M Jul  2 18:18 big_20_with_obj.json

运行文件:

> load('./big_15.json')
true
> Object.bsonsize(big)
7843932
> big.length
215001
> db.validcollection.find({'_id': {'$in': big}})

> load('./big_20.json')
true
> Object.bsonsize(big)
8028932
> big.length
220001
> db.validcollection.find({'_id': {'$in': big}})
error: {
     "$err" : "BSONObj size: 16828982 (0x100CA36) is invalid. Size must be between 0 and 16793600(16MB)",
     "code" : 10334
}

> load('./big_20_with_obj.json')
true
> Object.bsonsize(big)
4288915
> big.length
220001
> db.validcollection.find({'_id': {'$in': big}})
error: {
    "$err" : "BSONObj size: 17160614 (0x105D9A6) is invalid. Size must be between 0 and 16793600(16MB) First element: type: \"FETCH\"",
    "code" : 10334
}
> db.validcollection.find({'_id': {'$eq': big}})
>

最佳答案

你遇到了https://jira.mongodb.org/browse/SERVER-14123它描述了查询可能远低于 16MB 限制,但生成的内部查询运行器计划超过 16MB 限制的情况。

修复应该在下一个 2.6 版本中(可能在 2014 年 7 月本月晚些时候的某个时间发布 2.6.4)。

关于MongoDB 2.6 服务器对低于限制的查询抛出 'BSONObj size is invalid' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24538844/

相关文章:

node.js - MongoDB 不更新双嵌套数组中的子文档(使用 Mongoose FindByIdAndUpdate) - 已知确切位置

javascript - Nodejs,通过回调关闭mongo db连接

javascript - 如何在 Mongoose 中找到与数组字段的最后一个元素与给定查询值匹配的所有文档?

regex - 加快 MongoDB 中的正则表达式字符串搜索

MongoDB 聚合计算小时范围内的产品数量

mongodb - "populate"具有 $lookup 的字段而不覆盖现有值

MongoDB 计算与查询匹配的文档的真值和假值总数

javascript - 从位置字符串创建 JSON 对象

java - 无法使用 Mongodb Java 驱动程序更新内部 Arraylist 对象

JSON 对象映射到 mongoose schema _id