Mongodb数据统计及数据清除操作命令_数据库

目录

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 &

在使用这些命令之前,建议先在开发或测试环境中进行验证,确保其对您的数据库环境没有不良影响,再在生产环境中使用。


如果您觉得这篇帖子对您有所帮助,别忘了点击关注、点赞支持我们!同时也欢迎大家多多转发,让更多人看到,感谢大家的支持与鼓励!