• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

《MongoDB入门教程》第20篇 文档更新:UPSERT

武飞扬头像
不剪发的Tony老师
帮助2

第 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 } ]

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgacagb
系列文章
更多 icon
同类精品
更多 icon
继续加载