MongoDB 2.6服务器抛出&x27;BSONObj大小无效';低于限制的查询出错

MongoDB 2.6服务器抛出&x27;BSONObj大小无效';低于限制的查询出错,mongodb,mongodb-query,Mongodb,Mongodb Query,我一直在尝试从MongoDB 2.4升级到2.6,唯一阻碍我的是这种非常奇怪的行为。当使用相当大的查询~6MB查询Mongod2.4时,我没有问题——查询完成得很好(即使下面的数据是生成的和伪造的,我已经用有效数据进行了测试,查询完成)。在查询具有相同数据的mongod 2.6实例时,我得到以下错误: error: { "$err" : "BSONObj size: 16828982 (0x100CA36) is invalid. Size must be between 0 and

我一直在尝试从MongoDB 2.4升级到2.6,唯一阻碍我的是这种非常奇怪的行为。当使用相当大的查询~6MB查询Mongod2.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
    version-我已经测试了
    2.6.1
    -
    2.6.3
  • 如果查询返回数据或不返回数据(即,我可以尝试将_id与假id或真实id进行匹配,没有区别)
  • 如果我们在shell中使用或不使用
    ObjectId
    (请参见
    big\u 20\u with_obj.json
    ,使用echo行创建:
    echo“ObjectId(\'123451234512$i\”,
重要的事情:
  • mongod版本是
    2.6.X
    <代码>2.4.10及以下版本不受影响
  • 如果我们正在查询ObjectId字段
  • 如果集合存在(aka
    db.randomfakecollection.find({''u 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}})
>
您遇到了这样一种情况,即查询可能远远低于16MB限制,但生成的内部查询运行程序计划超过了16MB限制

该补丁应该在下一个2.6版本中发布(可能在2014年7月晚些时候发布2.6.4)