mongodb基础
数据库 mongo 0

连接

  • 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
mongodb基础
http://blog.sunafei.top/archives/1760346982363
作者
sunafei
发布于
更新于
许可