文章目录
CRUD 操作指的是对文档进行 create,read,update and delete 操作,即增删改查。
新增
MongoDB 提供了 3 个插入文档的方法:
- db.collection.insert()
- db.collection.insertOne()
- db.collection.insertMany()
db.collection.insertOne() 用于向集合插入单个文档。而 db.collection.insertMany() 和 db.collection.insert() 可以向集合插入多个文档。
insertOne
示例:
db.getCollection('test').insertOne({
"name": "redis设计与实现",
"type": "技术",
"desc": "redis相关介绍",
"price": "45"
})
执行命令后返回一个结果文档:
{
"acknowledged" : true,
"insertedId" : ObjectId("5de22784c5b99911d484e4fe")
}
表示插入成功。其中,acknowledged 代表本次操作的操作状态,状态值包括 true 和 false。insertedId 即该文档的 _id。
insertMany
示例:
db.getCollection('test').insertMany(
[{
"name" : "Tomcat架构解析",
"type" : "技术",
"desc" : "Tomcat相关介绍",
"price" : "40"
},
{
"name" : "Netty权威指南(第2版)",
"type" : "技术",
"desc" : "netty相关介绍",
"price" : "50"
}]
)
由于插入两个文档,返回结果如下:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5de35a12e492c4e276fd5d19"),
ObjectId("5de35a12e492c4e276fd5d1a")
]
}
insert
insert可以插入单个文档,也可以插入多个文档
修改
MongoDB 提供了几个方法用于更新文档,它们分别是:
- db.collection.updateOne(filter, update, options) 即使可能有多个文档通过过滤条件匹配到,但是也最多也只更新一个文档
- db.collection.updateMany(filter, update, options) 更新所有通过过滤条件匹配到的文档
- db.collection.replaceOne(filter, update, options) 即使可能有多个文档通过过滤条件匹配到,但是也最多也只替换一个文档
- db.collection.update(filter, update, options) 默认情况下只更新 一个 文档。要更新多个文档,使用 multi 选项。
updateOne
示例:
db.getCollection('test').updateOne(
{"_id": ObjectId("5de35a12e492c4e276fd5d19")},
{
$set:{"num":30}
}
)
updateMany
updateMany可以更新多个文档,用法和updateOne类似。
db.getCollection('test').updateMany(
{"name": /Tomcat架构解析/},
{
$set:{"num":30}
}
)
update
update() 方法的语法格式与 updateOne() 相同,但它默认只更新单个文档。
如果想更新所有匹配的文档,可以将指令 multi 设置为 true。效果和updateMany相同。
更新一个:
db.getCollection('test').update(
{"name": /Tomcat架构解析/},
{
$set:{"num":20}
}
)
更新多个:
db.getCollection('test').update(
{"name": /Tomcat架构解析/},
{
$set:{"num":20}
},
{multi:true}
)
replaceOne
replaceOne() 方法会根据查询条件替换集合中的单个文档。
db.getCollection('test').replaceOne(
{"name": /Tomcat架构解析/},
{
"name" : "Tomcat架构解析",
"type" : "技术",
"desc" : "Tomcat相关介绍",
"price" : "40",
"num" : 30
}
)
save
db.collection.save()是一个多用途的方法,它会根据 _id 是否存在而选择调用 insert() 或者 update()。
- 当文档中存在 _id 时,save() 等效于带有 upsert 指令的 update()
- 当文档中不包含 _id 时,save() 等效于 insert(),此时 MongoShell 将创建一个 ObjectId,并将其分配给 _id
字段更新操作符
MongoDB 中共有 9 个字段更新操作符,它们分别是:
- $currentDate 将字段的值设置为当前日期,可以是 Date 或 Timestamp。
- $inc 将指定字段的值与传入的值相加。
- $min 仅当指定的值小于现有字段值时才更新字段。
- $max 仅当指定的值大于现有字段值时才更新字段。
- $mul 将指定字段的值与传入的值相乘。
- $rename 重命名字段。
- $set 设置文档中字段的值。
- $setOnInsert 如果更新导致文档插入,则设置字段的值。对修改现有文档的更新操作没有影响。
- $unset 从文档中删除指定的字段。
$currentDate
$currentDate 的作用是将字段的值设为当前日期,其语法格式如下:
{ $currentDate: { <field1>: <typeSpecification1>, ... } }
其中,typeSpecification1 可以是一个布尔值、 {$ type: “timestamp”} 或者 {$type: “date”}
示例:
- 使用bool值或date
db.getCollection('test').update(
{ "_id" : ObjectId("5de22babc5b99911d484e500")},
{
$currentDate:{"modify_time":true}
}
)
db.getCollection('test').update(
{ "_id" : ObjectId("5de22babc5b99911d484e500")},
{
$currentDate:{"modify_time":{$type:"date"}}
}
)
modify_time字段结果如下:
"modify_time" : ISODate("2019-12-01T06:41:36.927Z")
- 使用timestamp:
db.getCollection('test').update(
{ "_id" : ObjectId("5de22babc5b99911d484e500")},
{
$currentDate:{"modify_time":{$type:"timestamp"}}
}
)
modify_time字段结果如下:
"modify_time" : Timestamp(1575182581, 1)
$ inc和$mul
$inc 的作用是按指定的数量增加字段的值
$mul 的作用是将指定字段的值与传入的值相乘
示例:
db.getCollection('test').update(
{ "_id" : ObjectId("5de22babc5b99911d484e500")},
{
$inc:{"num":2}
}
)
db.getCollection('test').update(
{ "_id" : ObjectId("5de22babc5b99911d484e500")},
{
$mul:{"num":2}
}
)
$ min和$max
$min 是仅当传入的值小于现有字段值时才更新字段。
$max 是仅当传入的值大于现有字段值,则更新对应字段值。
比如原有数据
{
"_id" : ObjectId("5de22babc5b99911d484e500"),
"name" : "Tomcat架构解析",
"type" : "技术",
"desc" : "Tomcat相关介绍",
"price" : "40",
"num" : 64.0,
"modify_time" : Timestamp(1575182581, 1)
}
- 使用$min:
db.getCollection('test').update(
{ "_id" : ObjectId("5de22babc5b99911d484e500")},
{
$min:{"num":2}
}
)
因为传入的值2小于原字段值64,num数据被修改为2。
- 使用$max:
db.getCollection('test').update(
{ "_id" : ObjectId("5de22babc5b99911d484e500")},
{
$max:{"num":3}
}
)
因为传入的值3大于原字段值2,num数据被修改为3。
$unset
$unset 的作用是删除文档中的指定字段
删除字段modify_time:
db.getCollection('test').update(
{ "_id" : ObjectId("5de22babc5b99911d484e500")},
{
$unset:{"modify_time":""}
}
)
$set
$set修改指定的字段
db.getCollection('test').update(
{ "_id" : ObjectId("5de22babc5b99911d484e500")},
{
$set:{"num":5}
}
)
$rename
$rename重命名字段
把字段num修改为字段number:
db.getCollection('test').update(
{ "_id" : ObjectId("5de22babc5b99911d484e500")},
{
$rename:{"num":"number"}
}
)
数组更新操作符
MongoDB 中共有 8 个数组更新操作符,它们是:
- $ 充当占位符以更新与查询条件匹配的第一个元素。
- $[] 充当占位符以更新数组中与查询条件匹配的文档中的所有元素。
- $[] 充当占位符以更新与 arrayFilters匹配查询条件的文档的条件匹配的所有元素。
- $addToSet 仅当数组中尚不存在元素时才将元素添加到数组中。
- $pop 删除数组的第一个或最后一个元素。
- $pull 删除与指定查询匹配的所有数组元素。
- $push 将元素添加到数组。
- $pullAll 从数组中删除所有匹配的值。
$pop
$pop 的作用是删除数组的第一个或最后一个元素.
假如有文档:
{
"_id" : ObjectId("5de22babc5b99911d484e500"),
"tag" : [
"A",
"B",
"C",
"D"
]
}
- 删除tag第一个元素:
db.getCollection('test').update(
{ "_id" : ObjectId("5de22babc5b99911d484e500")},
{
$pop:{"tag":-1}
}
)
- 删除tag最后一个元素
db.getCollection('test').update(
{ "_id" : ObjectId("5de22babc5b99911d484e500")},
{
$pop:{"tag":1}
}
)
$push
$push 的作用是将元素添加到数组
- 添加单个元素到数组:
db.getCollection('test').update(
{ "_id" : ObjectId("5de22babc5b99911d484e500")},
{
$push:{"tag":"E"}
}
)
- 添加数组,使用$each:
db.getCollection('test').update(
{ "_id" : ObjectId("5de22babc5b99911d484e500")},
{
$push:{"tag":{$each:["F","G"]}}
}
)
使用$position指定数组查询位置,当 $position 为负数时,将会从右往左插入
插入最前面:
db.getCollection('test').update(
{ "_id" : ObjectId("5de22babc5b99911d484e500")},
{
$push:{"tag":{$each:["H","I"],$position:0}}
}
)
删除
MongoDB 提供了几个方法用于删除文档,它们是:
- db.collection.deleteMany()
- db.collection.deleteOne()
- db.collection.remove()
要想从集合中删除所有文档,传递一个空的 filter document {} 给 db.collection.deleteMany() 或 db.collection.remove() 方法.
要想最多删除一个满足指定过滤条件的文档(即使多个文档可以满足该指定过滤条件),使用 db.collection.deleteOne() 方法或使用 db.collection.remove() 方法并将 justOne 参数设置为 true 或 1.
删除一个:
db.getCollection('test').deleteOne({"name": /Tomcat架构解析/})
db.getCollection('test').remove({"name": /Tomcat架构解析/},1)