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 неправильно оценивает размер входящего запроса и что я могу сделать это?

одна теория у меня есть, что есть некоторая разница в том, как оболочка и сервер видят ObjectIds, и так на сервере тот же запрос больше...


вещи, которые не имеют значения:

  • версия клиента 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 года).