mongo工具

备份-恢复

备份

# 备份库
mongodump -d meuat -o /data/db/backup/meuat-2025-0408

# 备份单表
mongodump -d prod -c t_new_delegation -o ./backupdb/table/

恢复

# 恢复库
mongorestore -d meuat /tmpdata/meuat-2025-0408/meuat

# 恢复前删除
mongorestore -d test --drop /bak/mongodump/*

# 指定恢复单个集合到另一个库
mongorestore --uri="mongodb://admin:admin123456@localhost:27017/" \
             --drop \
             --nsFrom="db1.t_msg_account" \
             --nsTo="mepro.t_msg_account" \
             /data/tmpdata/bk1/db1/t_msg_account.bson

用户

mongo --host 10.27.10.83 --port 27017 -u bunnyc -p --authenticationDatabase=bunnycdb
mongo --host 10.27.10.83 --port 27017 -u bunnyc -p 'passw0rd' --authenticationDatabase=bunnycdb



use bunnycdb
db.auth("bunnyc","Fcdseicx_f32")

综合

> show dbs              # 查看存在的数据库
> show collections      # show 集合

# 查看表字段
db.me_contact_talk_history.findOne()

# 查看表字段 - 全
db.me_contact_talk_history.aggregate([
  { $project: { _id: 0, fields: { $objectToArray: "$$ROOT" } } },
  { $unwind: "$fields" },
  { $group: { _id: null, allFields: { $addToSet: "$fields.k" } } }
])

检查和监控

mongostat --port 27017 -u myadmin -p 123456 --authenticationDatabase=admin

# 抓取当前正在执行中的 sql
db.currentOp()

# 查看耗时超过 1 秒的操作
db.currentOp({ "secs_running": { "$gt": 1 } });

# 查看运行时间超过 单位为微秒
db.currentOp({ "microsecs_running": { "$gt": 100000 } });

数据

db.t_name.find()
db.t_host.find({"mess_code":1001})

db.local('/tmp/file.json')      // 执行文件

db.t_name.remove()
db.t_name.drop()

索引

// 查看表的索引
db.t_name.getIndexes();

// 创建联合索引
db.t_name.createIndex({ fromAddr: 1, toAddr: 1, address: 1 })

// 创建单字段索引
db.t_name.createIndex({ address: 1 })

// 后台创建索引 - 避免阻塞
db.t_name.ensureIndex({address:1},{background:true})

// 查看索引
db.t_name.getIndexes()

// 查询文档上的索引 - 名称
db.t_name.getIndexes().forEach(function(index) {
    printjson(index.name)
})

停服

use admin
db.auth("root","passw0rd")
db.shutdownServer();

复杂查询

匹配条件

# sql 条件
$eq:        等于指定值
$ne:        不等于指定值
$gt:        大于指定值
$gte:       大于或等于指定值
$lt:        小于指定值
$lte:       小于或等于指定值
$in:        在指定数组中
$nin:       值不在指定数组中
$exists:    匹配包含指定字段
$type:      匹配指定数据类型
$regex:     使用正则表达式匹配字段值的文档
$not:       取反
$and
$or

简单查询

db.getCollection("t1").find({'address': 'aaaaa'});

db.t_name.find({"ip":"10.26.2.20", "cpu":{$gt:20}})
db.t_name.find({field:{$gt:value}});
db.t_name.find({"cpu_rate":{$gt:9}}).count()

db.t_name.remove({height: {$gt:5251149}})       // 删除大于指定高度的记录

复杂查询

// 统计数量
db.t_name.count()
db.t_name.find().count()

db.t_name.find().limit(1)                   // 查询第一条
db.t_name.find().sort({_id: -1}).limit(1)   // 查询最新一条

db.t_name.find({condition: "value"}).limit(1)   // 过滤后的第一条

db.t_name.find().sort({field: 1}).limit(1)  // 排序后的第一条

db.t_name.findOne()                         // 函数查询第一条
db.t_name.findOne({condition: "value"})     // 函数查询第一条-条件

// 按指定字段排序 - 取最大的值的一行
db.t_name.find().sort({ txs: -1 }).limit(1)

// 按指定字段排序 - 取最大的值的一行
db.t_name.aggregate([
    { $sort: { txs: -1 } },
    { $limit: 1 }
])

按日期分组统计

var results = db.t_name.aggregate([
    {
        $group: {
            _id: { $dateToString: { format: "%Y-%m-%d", date: "$timestamp" } },
            count: { $sum: 1 }
        }
    },
    {
        $sort: { _id: 1 }
    }
]).toArray();

results.forEach(function(result) {
    printjson(result);
});

遍历集合

// 获取当前数据库的所有集合名称
var collections = db.getCollectionNames();

// 遍历每个集合
collections.forEach(function(collectionName) {
    // 获取当前集合
    var collection = db.getCollection(collectionName);

    // 查询集合中是否存在包含`height`字段的文档
    var hasHeightField = collection.find({"height": {$exists: true}}).count() > 0;

    // 如果存在`height`字段,打印集合名称
    if (hasHeightField) {
        print("Collection with 'height' field: " + collectionName);
    }
});
最后更新于