mongodb基础
连接
- linux连接
- 无认证
mongosh
- 带认证
mongosh "mongodb://username:password@host:27017/?authSource=admin"
- 副本集
mongosh "mongodb://user:pass@host1:27017,host2:27017,host3:27017/?replicaSet=myReplicaSet&authSource=admin"
- 无认证
- url连接
- 语法
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
- 示例
mongodb://admin:123456@localhost/test
- 语法
数据库操作
- 创建/切换
use DATABASE_NAME
- 当前
db
- 所有
show dbs
- 删除
db.dropDatabase()
增删改
- 插入
db.collection_name.save({})
- 更新
- 语法
db.collection.update( <query>, <update>, { upsert: <boolean>, // 不存在是否插入,默认false multi: <boolean>, // 是否更全部,默认false只更新第一条 writeConcern: <document> }
- 示例
db.collection_name.update({'xx':'penglei'},{$set:{'xx':'xx'}}) db.collection_name.update({'_id': ObjectId('uuid')},{$set:{'xx':'xx'}}) db.collection_name.update({'_id': ObjectId('uuid')},{$set:{'xx':'xx'}}, false, true)
- 删除
- 语法
db.collection.remove( <query>, { justOne: <boolean>,// 可选。如果设为 true 或 1,则只删除一个文档 writeConcern: <document> } )
- 删除所有
db.collection_name.remove({})
- 删除集合
db.collection_name.drop()
查询
语法
- 语法
db.COLLECTION_NAME.find( query, projection // 执行返回键 )
- 美化输出
db.COLLECTION_NAME.find().pretty()
基础
- 小于
db.collection_name.find({"xx": {$lt:50}})
- 小于等于
db.collection_name.find({"xx": {$lte:50}})
- 大于
db.collection_name.find({"xx": {$gt:50}})
- 大于或等于
db.collection_name.find({"xx": {$gte:50}})
- 不等于
db.collection_name.find({"xx": {$ne:50}})
- OR
db.collection_name.find({$or: [{key1: value1}, {key2:value2}]})
- AND/OR
db.collection_name.find({favorite: {$gt:1000}, $or: [{"by": "penglei"},{"title": "PHP"}]})
- 时间
db.collection_name.find({createTime: { $gt: ISODate("2023-10-01T00:00:00Z") }})
- 分页
db.collection_name.find({},{"title":1,_id:0}).skip(1).limit(1)
跳过、限制条数 - 排序
db.collection_name.find({},{"title":1,_id:0,'favorite':1}).sort({"favorite":-1})
-1倒序 - 正则
db.collection_name.find({post_text:{$regex:"souyunku",$options:"$i"}})
- 使用变量
title:eval("/"+title+"/i")
// 等同于 title:{$regex:title,$Option:"$i"}
ObjectId
- 生成
ObjectId()
- 直接提取创建文档的时间戳
ObjectId("59ef2598a0f7c7d445f864b3").getTimestamp()
- 转字符串
ObjectId("59ef2598a0f7c7d445f864b3").str
聚合
- count
db.collection_name.aggregate([{$group : {_id : "$by_user", num_lession : {$sum : 1}}}]);
- sum
db.collection_name.aggregate([{$group:{_id:"$by_user",num_tutorial:{$sum : "$likes"}}}])
管道
- $match 过滤文档
- $project 筛选 / 重命名字段,添加计算字段
- $unwind 将数组拆分为多条文档
- $lookup 关联其他集合(左连接)
db.sales.aggregate([ // 阶段1:关联users集合(左连接) { $lookup: { from: "users", // 要关联的集合名 localField: "userId", // 当前集合的关联字段 foreignField: "_id", // 目标集合的关联字段 as: "userDetails" // 关联结果存储的数组字段名 }}, // 阶段2:将userDetails数组转为单个对象(因每个订单只关联一个用户) { $unwind: { path: "$userDetails", preserveNullAndEmptyArrays: true } }, // 保留无关联的文档 // 阶段3:只保留需要的字段 { $project: { product: 1, userDetails: { name: 1, city: 1 }, // 只保留用户的name和city _id: 0 // 排除_id }} ]);
- $addFields 添加新字段(保留原有字段)
- $cond 条件判断
db.sales.aggregate([ { $group: { _id: "$region", totalSales: { $sum: { $multiply: ["$price", "$quantity"] } } }}, { $project: { region: "$_id", totalSales: 1, isQualified: { $cond: { if: { $gt: ["$totalSales", 10000] }, // 条件:销售额>10000 then: "达标", else: "未达标" } }, _id: 0 }} ]);
备份恢复
备份
- 备份所有数据库到默认的 ./dump 目录
mongodump
- 备份 test 数据库到 ./backup 目录:
mongodump --db test --out ./backup
- 备份单个集合
mongodump --db test --collection users --out ./backup
- 按条件备份
mongodump --db test --collection users --query '{"age": {"$gt": 18}}' --out ./backup
- 备份远程带认证的数据库
mongodump --uri "mongodb://admin:123456@192.168.1.100:27017/prod?authSource=admin" --out ./prod_backup
mongodump --host 192.168.1.100 --port 27017 --username admin --password 123456 --authenticationDatabase admin --db prod --out ./prod_backup
- 压缩备份
mongodump --db test --gzip --out ./backup_gzip
恢复
- 还原所有数据库
mongorestore ./dump
- 还原指定数据库
mongorestore --db test_new ./backup/test
- 还原单个集合
mongorestore --db test --collection users_new ./backup/test/users.bson
- 还原前删除现有数据(避免重复)
mongorestore --db test --drop ./backup/test
# 还原test库,先删除现有test库的集合 - 还原远程数据库(带认证)
mongorestore --uri "mongodb://admin:123456@192.168.1.100:27017/prod?authSource=admin" --drop ./prod_backup/prod
- 还原压缩备份
mongorestore --gzip ./backup_gzip/test
其他
- 性能跟踪 mongotop
- 状态监测 mongostat