《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入门教程》第14篇 CRUD之更新文档

《MongoDB入门教程》第14篇 CRUD之更新文档

《MongoDB入门教程》第17篇 文档更新之$mul操作符

《MongoDB入门教程》第17篇 文档更新之$mul操作符

《MongoDB入门教程》第19篇 文档更新之$rename操作符

《MongoDB入门教程》第19篇 文档更新之$rename操作符