《MongoDB入门教程》第20篇 文档更新之UPSERT
Posted 不剪发的Tony老师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《MongoDB入门教程》第20篇 文档更新之UPSERT相关的知识,希望对你有一定的参考价值。
第 14 篇中介绍了更新文档的 updateOne() 和 updateMany() 方法,它们还支持一种特殊的操作:更新插入(UPSERT)。
更新插入
更新插入包含了两个操作,更新文档和插入文档:
- 如果存在匹配的文档,更新该文档;
- 否则,插入一个新文档。
如果想要实现更新插入,可以将 updateOne() 或者 updateMany() 方法中的 upsert 选项设置为 true:
db.collection.updateOne(filter, update, upsert: true )
document.collection.updateMany(filter, update, upsert: true )
默认情况下,第三个参数中的 upsert 字段为 false。意味着只有匹配查询条件的文档会被更新。
示例
创建以下文档集合:
db.products.insertMany([
"_id" : 1, "nmea" : "xPhone", "price" : 799, "releaseDate": ISODate("2011-05-14"), "spec" : "ram" : 4, "screen" : 6.5, "cpu" : 2.66 ,"color":["white","black"],"storage":[64,128,256],
"_id" : 2, "nmea" : "xTablet", "price" : 899, "releaseDate": ISODate("2011-09-01") , "spec" : "ram" : 16, "screen" : 9.5, "cpu" : 3.66 ,"color":["white","black","purple"],"storage":[128,256,512],
"_id" : 3, "nmea" : "SmartTablet", "price" : 899, "releaseDate": ISODate("2015-01-14"), "spec" : "ram" : 12, "screen" : 9.7, "cpu" : 3.66 ,"color":["blue"],"storage":[16,64,128],
"_id" : 4, "nmea" : "SmartPad", "price" : 699, "releaseDate": ISODate("2020-05-14"),"spec" : "ram" : 8, "screen" : 9.7, "cpu" : 1.66 ,"color":["white","orange","gold","gray"],"storage":[128,256,1024],
"_id" : 5, "nmea" : "SmartPhone", "price" : 599,"releaseDate": ISODate("2022-09-14"), "spec" : "ram" : 4, "screen" : 5.7, "cpu" : 1.66 ,"color":["white","orange","gold","gray"],"storage":[128,256]
])
下面的查询使用 updateMany() 方法更新文档(_id: 6)的 price 字段:
db.products.updateMany(
_id: 6 ,
$set: price: 999
)
查询没有匹配任何文档,因此不会更新任何文档:
acknowledged: true,
insertedId: null,
matchedCount: 0,
modifiedCount: 0,
upsertedCount: 0
如果将以上示例中 updateMany() 方法的 upsert 选项设置为 true,将会插入一个新文档。例如:
db.products.updateMany(
_id: 6 ,
$set: price: 999 ,
upsert: true
)
查询返回的结果如下:
acknowledged: true,
insertedId: 6,
matchedCount: 0,
modifiedCount: 0,
upsertedCount: 1
结果显示没有匹配任何文档(matchedCount: 0),updateMany() 方法没有更新任何文档。但是该方法插入了一个文档并返回了新文档的 id(upsertedId: 6)。
查询集合 products 中的文档,可以返回新的文档:
db.products.find(_id:6)
[ _id: 6, price: 999 ]
以上是关于《MongoDB入门教程》第20篇 文档更新之UPSERT的主要内容,如果未能解决你的问题,请参考以下文章
《MongoDB入门教程》第17篇 文档更新之$mul操作符
《MongoDB入门教程》第17篇 文档更新之$mul操作符