title: MongoDB数据操作
date: 2021-02-03 09:41:06
tags:
- MongoDB
categories: - MongoDB
Database数据库管理
-
查看数据库
show dbs show databases
-
创建数据库
use 数据库名 // 切换到指定的数据库,如果数据库不存在,则会自动创建数据库
-
删除数据库
当前用户进入某个数据库,就只能删除某个数据库
db.dropDatabase()
Collection集合管理
MongoDB中集合是一组文档的集,相当于关系数据库中的表
-
展示当前数据库所有集合
show tables show collections
-
创建集合
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 自动创建索引 }
-
查看集合的信息(状态)
db.集合名称.stats()
-
删除集合
db.集合名称.drop() // 返回为true 代表删除成功
Document文档操作
MongoDB中文档是指多个键及其关联的值有序的放置在一起
-
单数据新增写操作
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
-
多数据新增操作
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") ] }
-
数据查询
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}}) // 不等于
-
单数据查询
db.ego_users.findOne() // 返回自然排序的第一条,参数同find,比较到第一条符合条件的数据就会返回
-
查询展示部分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" }
-
多条件复杂查询
并列满足条件 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 }
-
分页查询
db.ego_users.find().limit(1) // 不传参数相当于所有 db.ego_users.find().skip(2) // 不传参数相当于0 db.ego_users.find().limit(1).skip(2) // 跳过两行 然后查询1行
-
sort 排序查询
db.ego_users.find().sort({age: -1}) // 降序 -1 db.ego_users.find().sort({age: 1}) // 升序 1
-
更新文档
- 覆盖(根据主键或者条件进行覆盖)
- 修改(根据条件进行修改)
以上两种方式都会先对文档进行标记删除,然后新建一个数据(主键不变),等到空闲时,再整理标记删除的文档
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条件更新
-
$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并没有变动,且没有被覆盖
-
$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 }
-
$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" }
-
$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" ] }
-
$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个
-
$pop 从数组中删除一个元素
db.ego_users.update({"name": "update"}, {"$pop": {"course": 1}}) // 删除最后一个元素 db.ego_users.update({"name": "update"}, {"$pop": {"course": -1}}) // 删除第一个元素
-
$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" ] }
-
$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" ] }
-
$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" ] }
-
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 }
-
删除文档
- 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})
-