MongoDB 2.6服务器在低于限制的查询上抛出“BSONObj大小无效”错误

时间:2014-07-02 18:50:05

标签: 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 "ObjectId(\"12345123451234512$i\"),"

重要的事情:

  • mongod版本为2.6.X; 2.4.10及以下不受影响
  • 如果我们要查询ObjectId字段
  • 如果集合存在(aka 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}})
>

1 个答案:

答案 0 :(得分:5)

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

修复程序应该在下一个2.6版本中(可能在本月晚些时候的某个时间段,可能是2.6.4)。