MongoDB数据操作


title: MongoDB数据操作
date: 2021-02-03 09:41:06
tags:

  • MongoDB
    categories:
  • MongoDB

Database数据库管理

  1. 查看数据库

    show dbs
    show databases
    
  2. 创建数据库

    use 数据库名
    // 切换到指定的数据库,如果数据库不存在,则会自动创建数据库
    
  3. 删除数据库

    当前用户进入某个数据库,就只能删除某个数据库

    db.dropDatabase()
    

Collection集合管理

MongoDB中集合是一组文档的集,相当于关系数据库中的表

  1. 展示当前数据库所有集合

    show tables
    show collections
    
  2. 创建集合

    db.createCollection(name, options)
    db.col.insert() // 向不存在的集合中插入数据,会自动创建
    
    options = {
        "capped": false, // 代表集合容量没有限制
        "size":10000, // 容量,单位字节,mongo会自动转化为大小最近的2的整次幂1000->1024,500->512,700-> 512+256
        "max": 100, // 最多多少条文档,先判断容量是否满,然后判断条数
        "autoindexId": true, // 创建的集合为_id 这个field 自动创建索引
    }
    
  3. 查看集合的信息(状态)

    db.集合名称.stats()
    
  4. 删除集合

    db.集合名称.drop() // 返回为true 代表删除成功
    

Document文档操作

MongoDB中文档是指多个键及其关联的值有序的放置在一起

  1. 单数据新增写操作

    db.ego_users.insert({"name": "zhangsan", "age":20}) // 新增
    db.ego_users.save({"name": "lisi", age: 10}) // 保存
    db.ego_users.insertOne({name: "wangwu", age: 12}) // 返回插入数据后的object_id
    
  2. 多数据新增操作

    db.ego_users.insert([{name: "lili", age: 18}, {name: "tom", age: 19}]) // 数组插入
    db.ego_users.save([{name: "lilei", age: 18}, {name: "tommy", age: 19}])
    db.ego_users.insertMany([{name: "lishe", age: 18}, {name: "jerry", age: 19}]) // 返回插入后数据的objet_id
    {
    	"acknowledged" : true,
    	"insertedIds" : [
    		ObjectId("601b613ab6e269069297fa60"),
    		ObjectId("601b613ab6e269069297fa61")
    	]
    }
    

    变量定义后插入

    > ego_user = ({name: "lisa", age: 10})
    { "name" : "lisa", "age" : 10 }
    > db.ego_users.insertOne(ego_user)
    {
    	"acknowledged" : true,
    	"insertedId" : ObjectId("601b622bb6e269069297fa62")
    }
    

    定义数组后插入

    > ego_users_array = ([{name: "lihao", age: 19}, {name: "misa", age: 13}])
    [
    	{
    		"name" : "lihao",
    		"age" : 19
    	},
    	{
    		"name" : "misa",
    		"age" : 13
    	}
    ]
    > db.ego_users.insertMany(ego_users_array)
    {
    	"acknowledged" : true,
    	"insertedIds" : [
    		ObjectId("601b62dfb6e269069297fa63"),
    		ObjectId("601b62dfb6e269069297fa64")
    	]
    }
    
  3. 数据查询

    db.ego_users.find()
    db.ego_users.find({name: "lili"})
    db.ego_users.find({age: 20})
    

    运算符

    db.ego_users.find({age: {$lt:10}}) // 小于
    db.ego_users.find({age: {$lte:10}}) // 小于等于
    
    db.ego_users.find({age: {$gt:10}}) // 大于
    db.ego_users.find({age: {$gte:10}}) // 大于等于
    
    db.ego_users.find({age: {$ne: 10}}) // 不等于
    
  4. 单数据查询

    db.ego_users.findOne() // 返回自然排序的第一条,参数同find,比较到第一条符合条件的数据就会返回
    
  5. 查询展示部分field

    db.ego_users.find({}, {"name": 1, "_id": 0}) // 想要查询的字段赋值1,不显示的赋值0
    db.ego_users.find({}, {"name": 1, "_id": 1}) // 显示指定_id字段为1,则其他字段必须同为零或同为1
    否则报错
    > db.ego_users.find({}, {"name": 0, "_id": 1})
    Error: error: {
    	"ok" : 0,
    	"errmsg" : "Projection cannot have a mix of inclusion and exclusion.",
    	"code" : 2,
    	"codeName" : "BadValue"
    }
    
  6. 多条件复杂查询

    并列满足条件
    db.ego_users.find({name: "zhangsan", age:{ "$gte": 20, "$lt": 80}})
    > db.ego_users.find({"$or": [{"name": "zhangsan"}, {"age": {"$lt":15}}]})
    { "_id" : ObjectId("601b5d7ab6e269069297fa58"), "name" : "zhangsan", "age" : 20 }
    { "_id" : ObjectId("601b5de0b6e269069297fa59"), "name" : "lisi", "age" : 10 }
    { "_id" : ObjectId("601b5e89b6e269069297fa5a"), "name" : "wangwu", "age" : 12 }
    { "_id" : ObjectId("601b622bb6e269069297fa62"), "name" : "lisa", "age" : 10 }
    { "_id" : ObjectId("601b62dfb6e269069297fa64"), "name" : "misa", "age" : 13 }
    
    或条件
    db.ego_users.find({"$or": [{"name": "zhangsan"}, {"age": {"$lt":15}}]})
    > db.ego_users.find({"$or": [{"name": "zhangsan"}, {"age": {"$lt":15}}]})
    { "_id" : ObjectId("601b5d7ab6e269069297fa58"), "name" : "zhangsan", "age" : 20 }
    { "_id" : ObjectId("601b5de0b6e269069297fa59"), "name" : "lisi", "age" : 10 }
    { "_id" : ObjectId("601b5e89b6e269069297fa5a"), "name" : "wangwu", "age" : 12 }
    { "_id" : ObjectId("601b622bb6e269069297fa62"), "name" : "lisa", "age" : 10 }
    { "_id" : ObjectId("601b62dfb6e269069297fa64"), "name" : "misa", "age" : 13 }
    
  7. 分页查询

    db.ego_users.find().limit(1) // 不传参数相当于所有
    db.ego_users.find().skip(2) // 不传参数相当于0
    db.ego_users.find().limit(1).skip(2) // 跳过两行 然后查询1行
    
  8. sort 排序查询

    db.ego_users.find().sort({age: -1}) // 降序 -1
    db.ego_users.find().sort({age: 1}) // 升序 1
    
  9. 更新文档

    • 覆盖(根据主键或者条件进行覆盖)
    • 修改(根据条件进行修改)

    以上两种方式都会先对文档进行标记删除,然后新建一个数据(主键不变),等到空闲时,再整理标记删除的文档

    MongoDB 通过update函数与save函数来更新集合中的文档

    • save更新文档

      save函数的作用是保存文档,如果文档存在则覆盖,如果文档不存在则新增。save函数对文档是否存在的唯一判断标准是_id系统唯一字段是否匹配。所以使用save函数实现更新操作,则必须提供_id字段数据,创建操作_id参数不是必传

      > db.ego_users.save({"_id": ObjectId("601b622bb6e269069297fa62"), "name": "saveUpdate", "age": 80})
      WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
      
    • udpate条件覆盖

      按照集合的自然顺序,进行匹配,匹配第一条成功后,立即覆盖,后续满足条件的数据不会覆盖

      > db.ego_users.find({name: "saveUpdate"}) // 查找到两个name为saveUpdate的记录
      { "_id" : ObjectId("601b622bb6e269069297fa62"), "name" : "saveUpdate", "age" : 80 }
      { "_id" : ObjectId("601cb8f0c981ca6ce30aa17e"), "name" : "saveUpdate", "age" : 80 }
      
      
      > db.ego_users.update({"name": "saveUpdate"}, {"name": "udpate", age: 68}) // 覆盖式的修改一次只修改一条数据
      > db.ego_users.update({"name": "saveUpdate"}, {"name": "udpate", age: 68})
      WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
      > db.ego_users.find({name: "saveUpdate"})
      { "_id" : ObjectId("601cb8f0c981ca6ce30aa17e"), "name" : "saveUpdate", "age" : 80 }
      
    • update条件更新

      1. $set 表达式

        > db.ego_users.update({"name": "udpate"}, {"$set": {"name": "update"}}) // $set 判定字段存在修改字段,字段不存在就增加字段
        WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
        > db.ego_users.find({"name": "update"})
        { "_id" : ObjectId("601b622bb6e269069297fa62"), "name" : "update", "age" : 68 } // 只更改了name,age并没有变动,且没有被覆盖
        
      2. $inc 数字增加表达式

        > db.ego_users.update({"name": "update"}, {"$inc": {"age": 10}})
        WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
        > db.ego_users.find({name: "update"})
        { "_id" : ObjectId("601b622bb6e269069297fa62"), "name" : "update", "age" : 78 }
        > db.ego_users.update({"name": "update"}, {"$inc": {"age": -10}})
        WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
        > db.ego_users.find({name: "update"})
        { "_id" : ObjectId("601b622bb6e269069297fa62"), "name" : "update", "age" : 68 }
        
      3. $unset 删除对应的字段

        > db.ego_users.update({"name": "update"}, {"$unset": {"age": 0}}) // age后的参数不影响结果,unset只关注字段名 
        WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
        > db.ego_users.find({name: "update"})
        { "_id" : ObjectId("601b622bb6e269069297fa62"), "name" : "update" }
        
      4. $push 数组类型字段末尾添加

        db.ego_users.update({"name": "update"}, {"$push": {"course": "GRPC"}}) // 添加一个GRPC课程,目标字段不存在会新增一个数组字段
        WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
        > db.ego_users.find({name: "update"}).pretty()
        {
        	"_id" : ObjectId("601b622bb6e269069297fa62"),
        	"name" : "update",
        	"course" : [
        		"Golang",
        		"Gin",
        		"MongoDB",
        		"GRPC"
        	]
        }
        
        // 新增一个字段
        > db.ego_users.update({"name": "update"}, {"$push": {"proto": "GRPC"}})
        WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
        >
        > db.ego_users.find({name: "update"}).pretty()
        {
        	"_id" : ObjectId("601b622bb6e269069297fa62"),
        	"name" : "update",
        	"course" : [
        		"Golang",
        		"Gin",
        		"MongoDB",
        		"GRPC"
        	],
        	"proto" : [
        		"GRPC"
        	]
        }
        
      5. $addToSet 将数组字段当作集合使用,不重复添加,大小写敏感

        > db.ego_users.update({"name": "update"}, {"$addToSet": {"course": "Gorm"}})
        WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
        > db.ego_users.find({name: "update"})
        { "_id" : ObjectId("601b622bb6e269069297fa62"), "name" : "update", "course" : [ "Golang", "Gin", "MongoDB", "GRPC", "Gorm" ], "proto" : [ "GRPC" ] }
        
        集合中有即将添加的元素时
        > db.ego_users.update({"name": "update"}, {"$addToSet": {"course": "Gin"}})
        WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 }) // 匹配1个修改了0个
        
      6. $pop 从数组中删除一个元素

        db.ego_users.update({"name": "update"}, {"$pop": {"course": 1}}) // 删除最后一个元素
        db.ego_users.update({"name": "update"}, {"$pop": {"course": -1}}) // 删除第一个元素
        
      7. $pull 将全部等值元素从数组中删除

        > db.ego_users.update({"name": "update"}, {"$pull": {"course": "Gin"}})
        WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
        > db.ego_users.find({name: "update"})
        { "_id" : ObjectId("601b622bb6e269069297fa62"), "name" : "update", "course" : [ "Golang", "MongoDB", "GRPC", "Gorm" ], "proto" : [ "GRPC" ] }
        
      8. $pullAll 一次删除多个元素

        > db.ego_users.find({name: "update"})
        { "_id" : ObjectId("601b622bb6e269069297fa62"), "name" : "update", "course" : [ "Golang", "MongoDB", "GRPC", "Gorm" ], "proto" : [ "GRPC" ] }
        > db.ego_users.update({"name": "update"}, {"$pullAll": {"course": ["Golang", "Gorm"]}}) // 会删除多个值
        WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
        > db.ego_users.find({name: "update"})
        { "_id" : ObjectId("601b622bb6e269069297fa62"), "name" : "update", "course" : [ "MongoDB", "GRPC" ], "proto" : [ "GRPC" ] }
        
      9. $rename 字段重命名

        > db.ego_users.find({name: "update"})
        { "_id" : ObjectId("601b622bb6e269069297fa62"), "name" : "update", "course" : [ "MongoDB", "GRPC" ], "proto" : [ "GRPC" ] }
        > db.ego_users.update({name: "update"}, {"$rename": {"course": "kecheng"}})
        WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
        > db.ego_users.find({name: "update"})
        { "_id" : ObjectId("601b622bb6e269069297fa62"), "name" : "update", "proto" : [ "GRPC" ], "kecheng" : [ "MongoDB", "GRPC" ] }
        
      10. update函数的upsert 和 multi参数都传true时

        • upsert: update操作没有能满足条件的数据时,新提供的数据作为新数据插入
        • multi: 取消只更新一个的操作,变为全部更新,批量更新,不支持覆盖更新,只支持表达式类型的更新
        > db.ego_users.update({"name": "abc"}, {$set: {"age": 25, "pswd": "abc"}}, false, false)
        WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 }) // 无满足条件的数据
        
        // 新增
        > db.ego_users.update({"name": "abc"}, {$set: {"age": 25, "pswd": "abc"}}, true, false)
        WriteResult({
        	"nMatched" : 0,
        	"nUpserted" : 1,
        	"nModified" : 0,
        	"_id" : ObjectId("601ce6691521d30eb375667c")
        })
        > db.ego_users.find({"name": "abc"})
        { "_id" : ObjectId("601ce6691521d30eb375667c"), "name" : "abc", "age" : 25, "pswd" : "abc" }
        
        // 多匹配
        > db.ego_users.find({age: 19})
        { "_id" : ObjectId("601b6053b6e269069297fa5c"), "name" : "tom", "age" : 19 }
        { "_id" : ObjectId("601b6105b6e269069297fa5f"), "name" : "tommy", "age" : 19 }
        { "_id" : ObjectId("601b613ab6e269069297fa61"), "name" : "jerry", "age" : 19 }
        { "_id" : ObjectId("601b62dfb6e269069297fa63"), "name" : "lihao", "age" : 19 }
        
        > db.ego_users.update({"age": 19}, {$inc: {"age": 1}}, false, false) // 传false则只会更新一个
        WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
        > db.ego_users.find({age: 20})
        { "_id" : ObjectId("601b5d7ab6e269069297fa58"), "name" : "zhangsan", "age" : 20 }
        { "_id" : ObjectId("601b6053b6e269069297fa5c"), "name" : "tom", "age" : 20 }
        
        > db.ego_users.find({age: 19}) // 更新多个记录
        { "_id" : ObjectId("601b6105b6e269069297fa5f"), "name" : "tommy", "age" : 19 }
        { "_id" : ObjectId("601b613ab6e269069297fa61"), "name" : "jerry", "age" : 19 }
        { "_id" : ObjectId("601b62dfb6e269069297fa63"), "name" : "lihao", "age" : 19 }
        > db.ego_users.update({"age": 19}, {$inc: {"age": 1}}, false, true)
        WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
        > db.ego_users.find({age: 19})
        > db.ego_users.find({age: 20})
        { "_id" : ObjectId("601b5d7ab6e269069297fa58"), "name" : "zhangsan", "age" : 20 }
        { "_id" : ObjectId("601b6053b6e269069297fa5c"), "name" : "tom", "age" : 20 }
        { "_id" : ObjectId("601b6105b6e269069297fa5f"), "name" : "tommy", "age" : 20 }
        { "_id" : ObjectId("601b613ab6e269069297fa61"), "name" : "jerry", "age" : 20 }
        { "_id" : ObjectId("601b62dfb6e269069297fa63"), "name" : "lihao", "age" : 20 }
        
      11. 删除文档

        • remove() 两个参数
        • deleteOne() 一个参数
        • deleteMany() 一个参数
        // remove,第二个参数不传或者传false会删除所有满足条件的数据
        > db.ego_users.find({age: {"$gt": 40}})
        { "_id" : ObjectId("601cb8f0c981ca6ce30aa17e"), "name" : "udpate", "age" : 69 }
        > db.ego_users.remove({age: {"$gt": 40}})
        WriteResult({ "nRemoved" : 1 })
        
        // 第二个参数传true,只删除一个元素
        > db.ego_users.find({age: {"$gt": 19}})
        { "_id" : ObjectId("601b5d7ab6e269069297fa58"), "name" : "zhangsan", "age" : 20 }
        { "_id" : ObjectId("601b6053b6e269069297fa5c"), "name" : "tom", "age" : 20 }
        { "_id" : ObjectId("601b6105b6e269069297fa5f"), "name" : "tommy", "age" : 20 }
        { "_id" : ObjectId("601b613ab6e269069297fa61"), "name" : "jerry", "age" : 20 }
        { "_id" : ObjectId("601b62dfb6e269069297fa63"), "name" : "lihao", "age" : 20 }
        { "_id" : ObjectId("601ce6691521d30eb375667c"), "name" : "abc", "age" : 25, "pswd" : "abc" }
        > db.ego_users.remove({age: {"$gte": 20}}, true)
        WriteResult({ "nRemoved" : 1 })  
        
        // deleteOne 删除一条
        > db.ego_users.find()
        { "_id" : ObjectId("601b5de0b6e269069297fa59"), "name" : "lisi", "age" : 10 }
        { "_id" : ObjectId("601b5e89b6e269069297fa5a"), "name" : "wangwu", "age" : 12 }
        { "_id" : ObjectId("601b6053b6e269069297fa5b"), "name" : "lili", "age" : 18 }
        { "_id" : ObjectId("601b6053b6e269069297fa5c"), "name" : "tom", "age" : 20 }
        { "_id" : ObjectId("601b6105b6e269069297fa5e"), "name" : "lilei", "age" : 18 }
        { "_id" : ObjectId("601b6105b6e269069297fa5f"), "name" : "tommy", "age" : 20 }
        { "_id" : ObjectId("601b613ab6e269069297fa60"), "name" : "lishe", "age" : 18 }
        { "_id" : ObjectId("601b613ab6e269069297fa61"), "name" : "jerry", "age" : 20 }
        { "_id" : ObjectId("601b622bb6e269069297fa62"), "name" : "update", "proto" : [ "GRPC" ], "kecheng" : [ "MongoDB", "GRPC" ] }
        { "_id" : ObjectId("601b62dfb6e269069297fa63"), "name" : "lihao", "age" : 20 }
        { "_id" : ObjectId("601b62dfb6e269069297fa64"), "name" : "misa", "age" : 13 }
        { "_id" : ObjectId("601ce6691521d30eb375667c"), "name" : "abc", "age" : 25, "pswd" : "abc" }
        >  db.ego_users.deleteOne({age: 18})
        { "acknowledged" : true, "deletedCount" : 1 }
        > db.ego_users.find({age:18})
        { "_id" : ObjectId("601b6105b6e269069297fa5e"), "name" : "lilei", "age" : 18 }
        { "_id" : ObjectId("601b613ab6e269069297fa60"), "name" : "lishe", "age" : 18 }
        
        
        // deleteMany 删除多条
        > db.ego_users.find({age:18})
        { "_id" : ObjectId("601b6105b6e269069297fa5e"), "name" : "lilei", "age" : 18 }
        { "_id" : ObjectId("601b613ab6e269069297fa60"), "name" : "lishe", "age" : 18 }
        > db.ego_users.deleteMany({age: 18})
        { "acknowledged" : true, "deletedCount" : 2 }
        > db.ego_users.find({age:18})
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值