我一直在尝试从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
的方式有所不同,等服务器上的查询相同...
2.6.X
版本 - 我测试了2.6.1
- 2.6.3
ObjectId
或不使用big_20_with_obj.json
,请使用回显线创建echo "ObjectId(\"12345123451234512$i\"),"
)2.6.X
; 2.4.10
及以下不受影响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}})
>
答案 0 :(得分:5)
您已遇到https://jira.mongodb.org/browse/SERVER-14123,其中描述了查询可能低于16MB限制的情况,但生成的内部查询运行器计划超出了16MB限制。
修复程序应该在下一个2.6版本中(可能在本月晚些时候的某个时间段,可能是2.6.4)。