MongoDB 2.6 server throwing "bsonobj size is invalid" ошибка при запросах ниже предела
я пытался перейти с MongoDB 2.4 на 2.6, и единственное, что меня сдерживает, это очень странное поведение. При запросе mongod 2.4 с довольно большим запросом ~6 МБ у меня нет проблем - запрос завершается просто отлично (даже если данные ниже генерируются и поддельные, я тестировал с допустимыми данными и запрос завершается). При запросе к экземпляру 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 неправильно оценивает размер входящего запроса и что я могу сделать это?
одна теория у меня есть, что есть некоторая разница в том, как оболочка и сервер видят ObjectId
s, и так на сервере тот же запрос больше...
вещи, которые не имеют значения:
- версия клиента monogdb
-
2.6.X
версия - я проверил2.6.1
-2.6.3
- если запрос возвращает данные или нет (т. е. я могу попытаться сопоставить _id с поддельными идентификаторами или реальными идентификаторами, нет разница)
- если мы, в оболочке, используйте
ObjectId
(см.big_20_with_obj.json
, созданный с помощью линии echo: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 ответов
вы столкнулись с https://jira.mongodb.org/browse/SERVER-14123 который описывает случай, когда запрос может быть значительно ниже предела 16MB, но внутренний план выполнения запросов превышает предел 16MB.
исправление должно быть в следующем выпуске 2.6 (вероятно, 2.6.4 некоторое время спустя в июле 2014 года).