更新
在实际操作中,可以使用更新文档的方式修改意见存在的文档。常用的更新操作有update()
和save()
。除此之外,还可以使用updateOne()
、updateMany()
、replaceOne()
。
1. update()
在更新文档的操作时,可以通过特定的条件来更新一个或多个文档。
(1) 语法格式
db.collection.update(
<query > ,
<update > ,
{
upsert: < boolean > ,
multi: < boolean > ,
writeConcern: < document > ,
collation: < document > ,
arrayFilters: [ < filterdocument 1 > , ...]
}
)
(2) 参数说明
-
query
:欲更新文档的筛选条件 -
update
:更新的字段和字段值 -
upsert
:可选参数。默认为false
。若设定为true
,则表示在更新条件没有匹配时,会插入此文档;若设定为false
,则不会新增文档。 -
multi
:此为可选参数。表示当更新条件匹配时,是否会更新全部匹配问到的文档。若设置为false
,则只会更新匹配到的第 1 个文档;若设置为true
,则表示会更新全部匹配到的文档。该选项默认为false
。 -
writeConcern
: 此为可选参数。表示是否使用写入策略。 -
collation
:可选参数。用来指定更新的排序规则。 -
arrayFilters
:MongoDB 3.6
版本之后才提供的可选参数。若要更新数组中的特定的元素,则可通过此参数对条件进行筛选。
(3) 范例
-
范例 1
:将Product
集合中SysNo
为2971
文档的Weight
字段的值改成1000
.执行操作中需指定文档筛选条件,并且在$set: { }
中设置要更新的文档内容。
更新前文档内容:
> db.Product.find({"SysNo": 2971}).pretty()
{
"_id" : ObjectId("60da83996350a57504489e73"),
"SysNo" : 2971,
"ProductName" : "DE - 1300 Earbuds",
"Weight" : 465, // 更新前为465
"ProductMode" : "Set"
}
更新文档:
>db.Product.update(
{ SysNo: 2971 }, // 更新文档的条件
{
"$set": { Weight: 1000} // 需要更新的内容
}
)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.Product.find({"SysNo": 2971}).pretty()
{
"_id" : ObjectId("60da83996350a57504489e73"),
"SysNo" : 2971,
"ProductName" : "DE - 1300 Earbuds",
"Weight" : 1000, // 修改后的值
"ProductMode" : "Set"
}
-
范例 2
:将DE -1300 Earbuds
的产品颜色由Red
改为Orange
。
在范例文档中,产品的颜色是使用数组结构来储存的,下面将介绍更新操作的arrayFilters
用法。如果想修改数组中特定的元素,则可以使用arrayFilters
参数来筛选符合条件的数组元素。
更新前的文档:
> db.Product.find({"ProductName": "DE -1300 Earbuds"}).pretty()
{
"_id" : ObjectId("60dad284063796028af0b881"),
"ProductName" : "DE -1300 Earbuds",
"Color" : [
"Red",
"White"
] // 更新前数据
}
更新文档:
> db.Product.update(
{"ProductName": "DE -1300 Earbuds"}, // 筛选条件
{$set: {"Color.$[i]": "Orange"}}, // 修改数组中元素数据
{arrayFilters: [{"i": {$eq: "Red"}}]} // 筛选数组中元素的条件
)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
在修改数组元素数据的语句中,$[i]
表示数组中元素的位置。如使用$[]
,则表示数组中所有元素。范例中的i
为自定义变量,用于arrayFilters
参数对数组中的元素进行筛选。$[i]
也可以直接指定元素的位置,Color.1
指Color
数组中第2个位置的元素(元素位置从0开始计算)。
更新后的文档数据:
> db.Product.find({"ProductName": "DE -1300 Earbuds"}).pretty()
{
"_id" : ObjectId("60dad284063796028af0b881"),
"ProductName" : "DE -1300 Earbuds",
"Color" : [
"Orange", // 更新后的数据
"White"
]
}
在执行这个操作时要特别注意,一定要使用3.6
版本之后的的工具(如mongod shell 3.6
版本),否则在执行此操作时会报错。
2. save()
save()
不仅可以插入文档,还可以更新文档。与update()
不同,save()
在更新文档时必须加上_id
字段,从而通过_id
字段对原文档进行覆盖式更新。
范例
更新前的数据
> db.Product.find({"ProductName": "DE -1300 Earbuds"}).pretty()
{
"_id" : ObjectId("60dad284063796028af0b881"),
"ProductName" : "DE -1300 Earbuds",
"Color" : [
"Orange",
"White"
]
}
更新文档
> db.Product.save({
"_id" : ObjectId("60dad284063796028af0b881"),
"ProductName" : "DE -1300 Earbuds",
"Color" : [
"Orange",
"Blue"
]
})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
更新后的数据
> db.Product.find({"ProductName": "DE -1300 Earbuds"}).pretty()
{
"_id" : ObjectId("60dad284063796028af0b881"),
"ProductName" : "DE -1300 Earbuds",
"Color" : [
"Orange",
"Blue"
]
}
3. updateOne()
updateOne()
也是一种更新文档的操作方法,但使用此方法只能更新一个文档。
更新前数据:
> db.Product.find({"SysNo": 123})
{ "_id" : ObjectId("60da7be26350a57504489e72"), "ProductNname" : "Rarbus", "SysNo" : 123, "Weigth" : 122, "ProductMode" : "" }
{ "_id" : 1, "ProductNname" : "Rarbus", "SysNo" : 123, "Weigth" : 122, "ProductMode" : "" }
{ "_id" : ObjectId("60da90d46350a57504489e75"), "ProductNname" : "Rarbus", "SysNo" : 123, "Weigth" : 122, "ProductMode" : "" }
{ "_id" : ObjectId("60da91676350a57504489e76"), "ProductNname" : "Rarbus", "SysNo" : 123, "Weigth" : 122, "ProductMode" : "" }
{ "_id" : ObjectId("60da91866350a57504489e77"), "ProductNname" : "Rarbus", "SysNo" : 123, "Weigth" : 122, "ProductMode" : "" }
更新文档数据:
> db.Product.updateOne({"SysNo": 123}, {$set: {Weigth: 678997768}})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
更新后数据:
> db.Product.find({"SysNo": 123})
{ "_id" : ObjectId("60da7be26350a57504489e72"), "ProductNname" : "Rarbus", "SysNo" : 123, "Weigth" : 678997768, "ProductMode" : "" }
{ "_id" : 1, "ProductNname" : "Rarbus", "SysNo" : 123, "Weigth" : 122, "ProductMode" : "" }
{ "_id" : ObjectId("60da90d46350a57504489e75"), "ProductNname" : "Rarbus", "SysNo" : 123, "Weigth" : 122, "ProductMode" : "" }
{ "_id" : ObjectId("60da91676350a57504489e76"), "ProductNname" : "Rarbus", "SysNo" : 123, "Weigth" : 122, "ProductMode" : "" }
{ "_id" : ObjectId("60da91866350a57504489e77"), "ProductNname" : "Rarbus", "SysNo" : 123, "Weigth" : 122, "ProductMode" : "" }
再次操作,测试:
> db.Product.updateOne({"SysNo": 123}, {$set: {Weigth: 678997768}})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 0 }
> db.Product.updateOne({"SysNo": 9898998989}, {$set: {Weigth: 98676656767}}, {multi: true})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
> db.Product.find({"SysNo": 9898998989})
{ "_id" : ObjectId("60da7be26350a57504489e72"), "ProductNname" : "Rarbus", "SysNo" : 9898998989, "Weigth" : 98676656767, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da83996350a57504489e73"), "SysNo" : 9898998989, "ProductName" : "DE - 1300 Earbuds", "Weight" : 1000, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da83996350a57504489e74"), "SysNo" : 9898998989, "ProductName" : "( Role Gold) 16GB", "Weight" : 143, "ProductMode" : "Set" }
{ "_id" : 1, "ProductNname" : "Rarbus", "SysNo" : 9898998989, "Weigth" : 122, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da90d46350a57504489e75"), "ProductNname" : "Rarbus", "SysNo" : 9898998989, "Weigth" : 122, "ProductMode" : "Set" }
{ "_id" : 2, "ProductNname" : "Rarbus", "SysNo" : 9898998989, "Weigth" : 222, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da91676350a57504489e76"), "ProductNname" : "Rarbus", "SysNo" : 9898998989, "Weigth" : 122, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da91866350a57504489e77"), "ProductNname" : "Rarbus", "SysNo" : 9898998989, "Weigth" : 122, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da99fd6350a57504489e78"), "Weigth" : 88888888, "ProductMode" : "Set", "SysNo" : 9898998989 }
4. updateMany()
updateMany()
方法可以同时更新多个文档,它与update()
方法设定multi
参数为true
的用法一样。
更新前数据
> db.Product.find({"ProductMode": ""})
{ "_id" : ObjectId("60da7be26350a57504489e72"), "ProductNname" : "Rarbus", "SysNo" : 123, "Weigth" : 678997768, "ProductMode" : "" }
{ "_id" : ObjectId("60da83996350a57504489e74"), "SysNo" : 8622, "ProductName" : "( Role Gold) 16GB", "Weight" : 143, "ProductMode" : "" }
{ "_id" : 1, "ProductNname" : "Rarbus", "SysNo" : 123, "Weigth" : 122, "ProductMode" : "" }
{ "_id" : ObjectId("60da90d46350a57504489e75"), "ProductNname" : "Rarbus", "SysNo" : 123, "Weigth" : 122, "ProductMode" : "" }
{ "_id" : 2, "ProductNname" : "Rarbus", "SysNo" : 333, "Weigth" : 222, "ProductMode" : "" }
{ "_id" : ObjectId("60da91676350a57504489e76"), "ProductNname" : "Rarbus", "SysNo" : 123, "Weigth" : 122, "ProductMode" : "" }
{ "_id" : ObjectId("60da91866350a57504489e77"), "ProductNname" : "Rarbus", "SysNo" : 123, "Weigth" : 122, "ProductMode" : "" }
更新数据
> db.Product.updateMany({"ProductMode": ""}, {$set: {"ProductMode": "Set"}})
{ "acknowledged" : true, "matchedCount" : 7, "modifiedCount" : 7 }
更新后数据
> db.Product.find({"ProductMode": "Set"})
{ "_id" : ObjectId("60da7be26350a57504489e72"), "ProductNname" : "Rarbus", "SysNo" : 123, "Weigth" : 678997768, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da83996350a57504489e73"), "SysNo" : 2971, "ProductName" : "DE - 1300 Earbuds", "Weight" : 1000, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da83996350a57504489e74"), "SysNo" : 8622, "ProductName" : "( Role Gold) 16GB", "Weight" : 143, "ProductMode" : "Set" }
{ "_id" : 1, "ProductNname" : "Rarbus", "SysNo" : 123, "Weigth" : 122, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da90d46350a57504489e75"), "ProductNname" : "Rarbus", "SysNo" : 123, "Weigth" : 122, "ProductMode" : "Set" }
{ "_id" : 2, "ProductNname" : "Rarbus", "SysNo" : 333, "Weigth" : 222, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da91676350a57504489e76"), "ProductNname" : "Rarbus", "SysNo" : 123, "Weigth" : 122, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da91866350a57504489e77"), "ProductNname" : "Rarbus", "SysNo" : 123, "Weigth" : 122, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da99fd6350a57504489e78"), "Weigth" : 88888888, "ProductMode" : "Set" }
测试
> db.Product.updateMany({"ProductMode": "Set"}, {$set: {"SysNo": 9898998989}}, {multi: false})
{ "acknowledged" : true, "matchedCount" : 9, "modifiedCount" : 9 }
> db.Product.find({"ProductMode": "Set"})
{ "_id" : ObjectId("60da7be26350a57504489e72"), "ProductNname" : "Rarbus", "SysNo" : 9898998989, "Weigth" : 678997768, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da83996350a57504489e73"), "SysNo" : 9898998989, "ProductName" : "DE - 1300 Earbuds", "Weight" : 1000, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da83996350a57504489e74"), "SysNo" : 9898998989, "ProductName" : "( Role Gold) 16GB", "Weight" : 143, "ProductMode" : "Set" }
{ "_id" : 1, "ProductNname" : "Rarbus", "SysNo" : 9898998989, "Weigth" : 122, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da90d46350a57504489e75"), "ProductNname" : "Rarbus", "SysNo" : 9898998989, "Weigth" : 122, "ProductMode" : "Set" }
{ "_id" : 2, "ProductNname" : "Rarbus", "SysNo" : 9898998989, "Weigth" : 222, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da91676350a57504489e76"), "ProductNname" : "Rarbus", "SysNo" : 9898998989, "Weigth" : 122, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da91866350a57504489e77"), "ProductNname" : "Rarbus", "SysNo" : 9898998989, "Weigth" : 122, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da99fd6350a57504489e78"), "Weigth" : 88888888, "ProductMode" : "Set", "SysNo" : 9898998989 }
5. replaceOne()
replaceOne()
方法与save()
方法类似,都是使用覆盖的方式更新文档。不同的是,replaceOne()
不需要使用使用_id
字段,并且只更新匹配到的第 1 个数据。
范例
// 更新前
> db.Product.find({"SysNo": 9898998989})
{ "_id" : ObjectId("60da7be26350a57504489e72"), "ProductNname" : "Rarbus", "SysNo" : 9898998989, "Weigth" : 98676656767, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da83996350a57504489e73"), "SysNo" : 9898998989, "ProductName" : "DE - 1300 Earbuds", "Weight" : 1000, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da83996350a57504489e74"), "SysNo" : 9898998989, "ProductName" : "( Role Gold) 16GB", "Weight" : 143, "ProductMode" : "Set" }
{ "_id" : 1, "ProductNname" : "Rarbus", "SysNo" : 9898998989, "Weigth" : 122, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da90d46350a57504489e75"), "ProductNname" : "Rarbus", "SysNo" : 9898998989, "Weigth" : 122, "ProductMode" : "Set" }
{ "_id" : 2, "ProductNname" : "Rarbus", "SysNo" : 9898998989, "Weigth" : 222, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da91676350a57504489e76"), "ProductNname" : "Rarbus", "SysNo" : 9898998989, "Weigth" : 122, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da91866350a57504489e77"), "ProductNname" : "Rarbus", "SysNo" : 9898998989, "Weigth" : 122, "ProductMode" : "Set" }
{ "_id" : ObjectId("60da99fd6350a57504489e78"), "Weigth" : 88888888, "ProductMode" : "Set", "SysNo" : 9898998989 }
// 更新
> db.Product.replaceOne({"SysNo": 9898998989}, {Weigth: 00098676656767})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
// 更新后
> db.Product.find({"Weigth": 00098676656767})
{ "_id" : ObjectId("60da7be26350a57504489e72"), "Weigth" : 98676656767 }