Каковы размеры, возвращаемые `show collections`?

Изменить: этот вопрос касается не show collections ванильной MongoDB, а mongo-hacker. Смотрите принятый ответ и комментарии.


Используя Mongo DB 3.2 + WiredTiger, show collections отображает два размера: s1 / s2.

show collections
coll_1               → 10.361MB / 1.289MB
coll_2               →  0.000MB / 0.004MB
coll_3               →  0.000MB / 0.016MB
coll_4               →  0.001MB / 0.031MB

Я предполагаю, что это:

  • s1: общий размер документов в базе данных
  • s2: размер базы данных на диске (документы + индексы) после сжатия

Это правильно? Я не смог найти никаких ссылок в документах.


person Jérôme    schedule 25.11.2016    source источник


Ответы (3)


Вы используете монго-хакер? По умолчанию в MongoDB 3.2.11 show collections вообще не показывает никакой информации о размере.

Информация о размере, предоставленная mongo-hacker, получена из вывода db.collection.stats().size, который показывает общий несжатый размер коллекции (без индексов), и db.collection.stats().storageSize, который показывает физический размер хранилища. Если вы включите сжатие в WiredTiger, storageSize обычно будет меньше, чем size.

Вы можете найти соответствующий исходный код здесь: https://github.com/TylerBrock/mongo-hacker/blob/0.0.13/hacks/show.js#L57-L72

person kevinadi    schedule 01.12.2016
comment
Так что это то, что я определил как общий размер документов и размер на диске (документы + индексы). Спасибо за исходный код. Это выглядит примерно так. Однако я никогда не слышал о mongo-hacker. Я использую пакеты MongoDB Debian из репозитория Mongo. Разве у нас не тот же Mongo по умолчанию? - person Jérôme; 01.12.2016
comment
Хорошо, я понимаю. Я скопировал .mongorc.js у своего коллеги, чтобы получить раскрашенную оболочку, и она включает в себя монго-хакерские вещи. Я не помню, чтобы конкретно устанавливал mongo-hacker, но, похоже, он работает. Спасибо. - person Jérôme; 01.12.2016
comment
Да, mongo-hacker работает, создавая .mongorc.js в вашем домашнем каталоге. Я думаю, вы можете случайно использовать mongo-hacker, если скопировали чей-то файл .mongorc.js. Обратите внимание, что вы можете запустить оболочку mongo с mongo --norc, чтобы игнорировать файл rc. - person kevinadi; 02.12.2016
comment
Я действительно хочу использовать этот файл .rc. Я просто скопировал его, не проверяя, что внутри (это из доверенной зоны...), и я думал, что это в основном касается цветов, я не думал, что это повлияет на эти выходные данные. Но это приятно, и я рад, что это так. Кстати, причина, по которой я не помню, чтобы устанавливал mongo-hacker, заключается в том, что мой коллега хотел избежать использования npm (мы из мира Python, JS — враждебная территория), поэтому он в основном объединил файлы mongo-hacker в один файл .rc. Возможно, это не лучшая практика, но это уже другая история... В любом случае спасибо, что разобрались. - person Jérôme; 02.12.2016
comment
Рад помочь. На самом деле вам не нужен npm для использования mongo-hacker. По сути, это репозиторий github, и вы устанавливаете его с помощью команды make install, которая, по сути, делает то, что вы описали (объединяет разные файлы в один файл rc). Вот ссылка на сайт: tylerbrock.github.io/mongo-hacker, который также перечисляет дополнительные функции, которые поставляются с ним по умолчанию. Я настоятельно рекомендую это, так как вы можете добавлять/удалять хаки по своему усмотрению. - person kevinadi; 02.12.2016
comment
Верно. Я так и сделаю, так намного лучше. Спасибо еще раз. - person Jérôme; 05.12.2016
comment
Я использую крошечную функцию на своих серверах, больше не могу использовать ванильную консоль... github.com/thapakazi/kutto_kodalo/blob/gumantae/shellrc.d/ - person thapakazi; 02.01.2017

Вы можете использовать следующий запрос, чтобы получить размер каждой коллекции:

var collectionNames = db.getCollectionNames(), stats = [];
collectionNames.forEach(function (n) { stats.push(db[n].stats()); });
for (var c in stats) {
    print(stats[c]['ns'] + ": " + stats[c]['size'] + " (" + stats[c]['storageSize'] + ")");
}
person kalaivani    schedule 26.11.2018
comment
для размеров в ГБ используйте print(stats[c]['ns'] + ": " + stats[c]['size'] + " (" + stats[c]['storageSize']/1073741824.0 + "GB)") - person Mugen; 09.07.2020

Очень похоже на ответ @kalaivani, я просто реорганизовал его для более легкого (для меня) понимания, а также для печати в ГБ.

// Get collection names
var collectionNames = db.getCollectionNames()
var col_stats = [];

// Get stats for every collections
collectionNames.forEach(function (n) { 
    col_stats.push(db.getCollection(n).stats());
});

// Print
for (var item of col_stats) {
    print(`${item['ns']} | size: ${item['size']} 
(${(item['size']/1073741824).toFixed(2)} GB) | storageSize: ${item['storageSize']} 
(${(item['storageSize']/1073741824).toFixed(2)} GB)`);
}
person Lelo    schedule 11.05.2020