在 Mongoose 中插入新的重复记录时替换旧记录

Posted

技术标签:

【中文标题】在 Mongoose 中插入新的重复记录时替换旧记录【英文标题】:Replace old records while inserting new duplicate records in Mongoose 【发布时间】:2022-01-12 21:54:51 【问题描述】:

mongoDB 集合:

db.collection.find()

  _id:'...', emp: 'A', name: 'nameA', age: 23 
  _id:'...', emp: 'B', name: 'nameB', age: 54 
  _id:'...', emp: 'C', name: 'nameC', age: 45 

集合中插入的数据:

  _id:'...', emp: 'D', name: 'nameA', age: 22 
  _id:'...', emp: 'B', name: 'nameB1', age: 34 
  _id:'...', emp: 'A', name: 'nameA1', age: 47 
  _id:'...', emp: 'E', name: 'nameE', age: 23 

重复的 emp 行的数据将被新添加的值替换。 在集合中插入新数据后的输出:

  _id:'...', emp: 'A', name: 'nameA1', age: 47 
  _id:'...', emp: 'B', name: 'nameB1', age: 34 
  _id:'...', emp: 'C', name: 'nameC', age: 45 
  _id:'...', emp: 'D', name: 'nameD', age: 22 
  _id:'...', emp: 'E', name: 'nameE', age: 23 

【问题讨论】:

问题是什么? 向集合中添加新记录时,重复的 emp 行值将被替换为新值。 所以我假设emp 字段不是唯一值,并且您希望有多个带有emp: 'A' 的对象而不是删除它们?当您对给定字段的约束有问题时,通常会发生删除。能否提供调用数据库插入新对象的函数? 我想用新的姓名和年龄值替换旧的 emp: 'A'。我正在使用基本的插入方法来插入新数据。 使用带有 upsert 选项的更新 【参考方案1】:

在更新选项中指定upsert: true

插入案例:

db.collection.update(
  emp: "E"
,

  $set: 
    name: "nameE",
    age: 23
  ,
  "$setOnInsert": 
    _id: 5,
    emp: "E"
  
,

  upsert: true
)

Mongo playground

更新案例:

db.collection.update(
  emp: "A"
,

  $set: 
    name: "nameA1",
    age: 47
  ,
  "$setOnInsert": 
    _id: 1,
    emp: "A"
  
,

  upsert: true
)

Mongo playground

【讨论】:

以上是关于在 Mongoose 中插入新的重复记录时替换旧记录的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mongodb 中自动插入记录(nodejs、express、mongoose)

Mongoose:批量更新插入,但仅在满足某些条件时才更新记录

mongoose中Documents的save方法

插入并返回插入的行数(非重复)和记录 ID(新的或重复的)

根据 Oracle APEX 项目值更新和插入

使用 mongoose 将从 JSON 接收的多条记录插入到集合中