Найти самый большой размер документа в MongoDB

Можно ли найти самый большой размер документа в MongoDB?

db.collection.stats() показывает средний размер, который не является действительно представительным, потому что в моем случае размеры могут значительно отличаться.

 vinipsmaker06 июн. 2013 г., 06:57
Я нене знаю, какой ты водительиспользовать, но вы должны увидетьразмер бсон как-то. Сделайте это и отсканируйте таблицу, чтобы выяснить, какой документ самый большой.
 Dan Dascalescu08 мая 2019 г., 22:33
@Sammaye: вы можетеиспользовать агрегацию для расчета размеров самых больших подозрительных полей на сервере, Это решение намного быстрее, чем любые другие ответы.
 Sammaye06 июн. 2013 г., 09:41
Не легко, нет$documentSize оператор в запросе MongoDB и$size делает что-то совсем другое. Единственным реальным способом в большинстве драйверов на стороне клиента, включая javascript, является использование помощника на стороне клиента.
 Sammaye09 мая 2019 г., 00:07
@ DanDascalescu не совсем, он делает то же самое, что и принятый ответgithub.com/eladnava/mongodb-largest-documents/blob/master/lib/...

Ответы на вопрос(3)

Примечание: это попытается сохранить весь набор результатов в памяти (из.toArray) Осторожно на больших наборах данных. Не использовать в производстве! Abishek»Ответ s имеет преимущество работы с курсором, а не с массивом в памяти.

Если вы также хотите _id, попробуйте это. Учитывая коллекцию под названием "Запросы" :

// Creates a sorted list, then takes the max
db.requests.find().toArray().map(function(request) { return {size:Object.bsonsize(request), _id:request._id}; }).sort(function(a, b) { return a.size-b.size; }).pop();

// { "size" : 3333, "_id" : "someUniqueIdHere" }
 Pete Garafano10 дек. 2016 г., 19:23
@MikeGraf Я не проголосовал, потому что "скопировать и вставить в продукт, Я проголосовал за это, потому что я чувствую, что это подпадает подрекомендации, данные StackOverflow о том, когда голосовать против. Я'Мне жаль, что вы чувствуете иначе, однако я поддерживаю свой голос.
 Dan Dascalescu08 мая 2019 г., 22:31
Вот'гораздо более быстрое решение с использованиемиспользуя агрегациюкоторый также нене требует доведения полного набора результатов на клиенте.
 Lukas07 июл. 2018 г., 03:31
Определенно не для производства со многими документами, но это работает как шарм на моей локальной машине с примерами данных из производственной базы данных.
 Mike Graf09 дек. 2016 г., 22:54
@PeteGarafano В ответе довольно четко сказано, что он запустит все это в память, а не для производства. Не голосуйте за меня, потому что вы копируете и вставляете в продукт.
 mes25 авг. 2015 г., 13:39
Это лучший ответ, который я видел!
 Mrchief14 окт. 2014 г., 19:31
После запуска принятого ответа, это следующий скрипт, который каждый захочет запустить!
 Mike Graf12 дек. 2016 г., 23:25
@PeteGarafano Предположительно эта частьand perhaps dangerously incorrect.  , Я'посмотрим, смогу ли я обновить в ближайшее время.
 Felix Schmidt16 окт. 2015 г., 08:33
Я получаю сообщение об ошибке: Ошибка: утверждение src \ mongo \ util \ net \ message_port.cpp: 195 src / mongo / shell / query.js: 113
 Lehan Coetzee20 июл. 2016 г., 11:16
Это должен быть принятый ответ.
 HaBo16 авг. 2016 г., 19:11
Это лучший ответ, чем цикл foreach
 Pete Garafano09 дек. 2016 г., 19:15
Это должноне быть принятым ответом. призваниеtoArray() на большой коллекции может произойти сбой клиента. Вы можете'10 тБ данных в клиентпамять, а затем попытатьсяmap Это. Вы должны повторить это и позволить драйверу обрабатывать пакетирование.

Если ты'работа с огромной коллекцией, загрузка всего этого сразу в память не будет работать, так как выДля этого потребуется больше оперативной памяти, чем размер всей коллекции.

Вместо этого вы можете обрабатывать всю коллекцию партиями, используя следующий пакет, который я создал:https://www.npmjs.com/package/mongodb-largest-documents

Все, что вам нужно сделать, это предоставить строку подключения MongoDB и имя коллекции. Скрипт выведет первые X самых больших документов, когда он закончит обход всей коллекции в пакетном режиме.

 Elad Nava06 сент. 2017 г., 07:06
Привет @dmo, не могли бы вы предоставить команду для достижения этого через встроенный курсор?
 Sammaye09 мая 2019 г., 00:08
Этот ответ неНе имеет особого смысла, курсор по умолчанию любого клиентского драйвера не будет загружать коллекцию в память, фактически, если вы пойдете по маршруту структуры агрегации, как упомянул Дэн, он загрузит весь набор результатов в память. Хорошо отметить, что делает то же самое, что и принятый ответ, только в node.jsgithub.com/eladnava/mongodb-largest-documents/blob/master/lib/...
 Elad Nava16 сент. 2017 г., 05:53
Круто, неЯ не знаю, что можно сделать. Престижность!
 dmo01 сент. 2017 г., 01:31
Это именно то, что позволяет встроенный курсор. Он передает данные, а не хранит всю коллекцию в оперативной памяти.
 Dan Dascalescu08 мая 2019 г., 02:03
@dmo: как этоcursor.on('data', ...) подход сравнить спринятый ответ? Это быстрее? Это потребляет меньше памяти?
 dmo11 сент. 2017 г., 18:39
collection.find () возвращает курсор. Курсор - это поток данных. Так что в JS вы можете сделать что-то вроде этого ...jsfiddle.net/ro6efkdz
Решение Вопроса

Вы можете использовать небольшой скрипт оболочки, чтобы получить это значение.

Примечание. После этого будет выполнено полное сканирование таблицы.

var max = 0;
db.test.find().forEach(function(obj) {
    var curr = Object.bsonsize(obj); 
    if(max < curr) {
        max = curr;
    } 
})
print(max);
 Filip Bartuzi27 июн. 2017 г., 10:45
@akki, да, bsonsize возвращает значение в байтах (согласноMognodb Docs
 Dan Dascalescu08 мая 2019 г., 22:30
@BlackOverlord:да, Это решение намного быстрее, чем это.
 akki23 окт. 2016 г., 12:00
Я полагаю, этот размер в байтах?
 sashkello06 июн. 2013 г., 11:40
Спасибо! Это сработало отлично.
 BlackOverlord24 авг. 2017 г., 15:18
Есть ли способ НЕ загружать каждый документ клиенту для расчета его размера? Возможно, используя агрегацию как-то.

Ваш ответ на вопрос