目录
1. 统计数据库信息
2. 统计DB下的集合信息
3. 统计DB下的索引信息
4. 批量清除数据
以下操作是 MongoDB 中日常常用的一些统计命令,用于查看数据库和集合的基本信息(最好在数据库工具中执行这些命令):
每个数据库的统计信息
db.adminCommand("listDatabases").databases.forEach(function (d) {
mdb = db.getSiblingDB(d.name);
printjson(mdb.stats());
})
统计某个DB集合的行数以及大小
// 获取数据库中所有集合的信息
var collectionInfos = db.getCollectionInfos();
// 遍历每个集合并打印其文档数量和大小
collectionInfos.forEach(function(collectionInfo) {
var collectionName = collectionInfo.name;
var stats = db.getCollection(collectionName).stats();
var count = stats.count;
var sizeGB = stats.size / (1024 * 1024 * 1024);
print("Collection: " + collectionName + ", Document Count: " + count + ", Size: " + sizeGB.toFixed(2) + "GB");
});
获取库内集合的索引情况
// 索引 db.getSiblingDB('your_database_name').getCollectionNames().forEach(function(collName) {
var indexes = db.getCollection(collName).getIndexes();
print("Indexes for " + collName + ": ");
printjson(indexes); }); // 索引个数: db.getSiblingDB('crmdb').getCollectionNames().forEach(function(collName) {
if (collName !== 'system.indexes') { // 避免统计 system.indexes 集合
var indexCount = db.getCollection(collName).getIndexes().length;
print("Number of indexes for " + collName + ": " + indexCount);
}
});
4.4版本以上
db.getSiblingDB('your_database_name').getCollectionInfos({},{name: 1}).forEach(function(collection) {
var indexes = db.getCollection(collection.name).getIndexes();
print("Indexes for " + collection.name + ": ");
printjson(indexes);
});
单个库下每个集合每个索引的大小
// 获取数据库中每个集合每个索引的大小
function getIndexSizesPerCollection(dbName) {
// 获取数据库中的所有集合名称
var collections = db.getSiblingDB(dbName).getCollectionNames();
// 转换字节为 GB
function bytesToGB(bytes) {
return (bytes / (1024 * 1024 * 1024)).toFixed(3); // 保留三位小数
}
// 遍历每个集合
collections.forEach(function(collectionName) {
var collection = db.getSiblingDB(dbName).getCollection(collectionName);
var stats = collection.stats();
// 输出集合名称
print("Collection: " + collectionName);
// 输出每个索引及其大小
for (var indexName in stats.indexSizes) {
if (stats.indexSizes.hasOwnProperty(indexName)) {
print(" Index: " + indexName + " - Size: " + bytesToGB(stats.indexSizes[indexName]) + " GB");
}
}
});
}
// 传入数据库名
getIndexSizesPerCollection('tcldb');
批量清除数据
vim batchDelete_1.6.js
// 定义批次大小
var batchSize = 1000;
// 定义删除条件
// 根据_id删除,不准确(经测试删除了一部分)
//var deleteCondition = { "_id": { "$lt": ObjectId("66603e31efb33823031c23b2") } };
//var deleteCondition = { "createTime": { "$lt": 1656000000000 } };
//var deleteCondition = { "createTime": { "$lt": "2022-06-24 00:00:00" } };
var deleteCondition = { "dayTime": { "$lt": "2022-06-24" } };
//var deleteCondition = { "createTime": null };
// 初始化已删除文档计数
var deletedCount = 0;
// 定义删除操作之间的间隔时间(毫秒)
var interval = 150;
while (true) {
// 查询符合条件的文档并限制数量为 batchSize
var documents = db.pro_report.find(deleteCondition).limit(batchSize).toArray();
// 如果没有符合条件的文档,则退出循环
if (documents.length === 0) {
break;
}
// 获取所有符合条件的文档的 _id
var ids = documents.map(function(doc) { return doc._id; });
// 删除符合条件的文档
var result = db.pro_report.deleteMany({ "_id": { "$in": ids } });
// 累加已删除文档计数
deletedCount += result.deletedCount;
// 打印已删除文档的数量
print("Deleted " + result.deletedCount + " documents in this batch. Total deleted: " + deletedCount);
// 等待一段时间再继续下一批删除
sleep(interval);
}
// 打印删除操作完成信息
print("Completed deletion. Total documents deleted: " + deletedCount);
// 定义 sleep 函数
function sleep(milliseconds) {
var start = new Date().getTime();
while (new Date().getTime() - start < milliseconds);
}
执行
nohup mongo 172.10.10.11:27000/cr8db -u crmuser -p s******N batchDelete_1.6.js >> del.log &
在使用这些命令之前,建议先在开发或测试环境中进行验证,确保其对您的数据库环境没有不良影响,再在生产环境中使用。
如果您觉得这篇帖子对您有所帮助,别忘了点击关注、点赞支持我们!同时也欢迎大家多多转发,让更多人看到,感谢大家的支持与鼓励!