`show collections` 返回的尺寸是多少?

What are the sizes returned by `show collections`?

编辑:这个问题不是关于 vanilla MongoDB 的 show collections,而是关于 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

我猜这些是:

这是正确的吗?我在 docs.

中找不到任何参考资料

你在使用 mongo-hacker 吗?默认情况下,在 MongoDB 3.2.11 中,show collections 根本不显示任何大小信息。

mongo-hacker 提供的大小信息是从 db.collection.stats().size 的输出中获得的,它显示了集合的总未压缩大小(without索引)和 db.collection.stats().storageSize 显示物理存储大小。如果您在 WiredTiger 中启用压缩,storageSize 通常会小于 size

您可以在这里找到相关的源代码:https://github.com/TylerBrock/mongo-hacker/blob/0.0.13/hacks/show.js#L57-L72

您可以使用以下查询来获取每个集合的大小:

var collectionNames = db.getCollectionNames(),
  stats = [];
collectionNames.forEach(function (n) {
  stats.push(db[n].stats());
});
for (var c in stats) {
  // skip views
  if (!stats[c]["ns"]) continue;
  print(stats[c]["ns"] + ": " + stats[c]["size"] + " (" + (stats[c]["storageSize"] / 1073741824).toFixed(3) + "GB)");
}

输出示例:

cod-prod-db.orders: 35179407 (0.012GB)
cod-prod-db.system.profile: 4323 (0.000GB)
cod-prod-db.users: 21044037 (0.015GB)

与@kalaivani 的回答非常相似,我只是重构它以便于(对我而言)理解并以 GB 打印

// 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)`);
}