【问题标题】:Mongoose: update only undefined / unexisting properties and let existing unmodifiedMongoose:只更新未定义/不存在的属性并让现有的未修改
【发布时间】:2020-10-15 06:09:35
【问题描述】:

假设我在 mongo 中有以下数据:

{name: "peter", jobTitle: "engineer", id: 17, webs:[]} 

我从他那里得到了更多信息,所以我想更新不存在的属性:

新数据:

{id:17, jobTitle: "gdkjd", phone:"+397373888348", mail:"hello@example.org", webs:["one"],}

我希望实现的目标

{id:17, name: "peter", jobTitle: "engineer", phone:"+397373888348", mail:"hello@example.org", webs:["one"]}

有没有办法在不单独检查哪些属性已经设置的情况下获得这个?

注意:特别复杂的是向数组添加值而不覆盖它的想法。所以不要想象我原来的数组是:

网络:[“二”,“三”]

所以有了这个“不间断更新”,我希望数据库有这个:

网络:[“二”、“三”、“一”]

【问题讨论】:

  • 什么版本的 MongoDB?
  • mongo 4.2.8 mongoose 5.9.19

标签: javascript node.js json mongodb mongoose


【解决方案1】:

对于非数组字段,您可以使用带有$mergeObjects 运算符的管道形式的更新来获得此行为。

要专门处理数组等字段,请先分配这些字段。比如:

newData={id:17, jobTitle: "gdkjd", phone:"+397373888348", mail:"hello@example.org", webs:["one"]}

db.collection.update({id:newData.id},
                     [
                       {$set:{webs:{$concatArrays:[
                                     {$cond:[
                                         {$eq:[{$type:"$webs"},"array"]},
                                         "$webs",
                                         []
                                     ]},
                                   newData.webs
                       ]}}},
                       {$set:{newDoc:{$mergeObjects:[newData,"$$ROOT"]}}},
                       {$replaceRoot:{newRoot: "$newDoc"}}
                     ]
)

【讨论】:

  • 太棒了!数组的东西不起作用,如果旧值有一个空数组,则不会有新项目出现:(
  • 我正在这样做: const company = await Company.findOneAndUpdate( { id: result.id}, [ { $set: { webs: { $concatArrays: ["$webs", result.webs] , }, }, }, { $set: { newDoc: { $mergeObjects: [result, "$$ROOT"] } } }, { $replaceRoot: { newRoot: "$newDoc" } }, ]).exec( );
  • 嗯,如果之前的 webs 为空,那可能是这样。也许将 $push 与 $each 一起使用会更好?
  • $push 不是聚合运算符,因此它不起作用。也许是有条件的。
  • 是的,试过了,推送没有用!但多亏了你,我开始理解逻辑(我是 mongo 的新手)
猜你喜欢
  • 2017-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
  • 2019-03-09
  • 1970-01-01
  • 2021-12-26
相关资源
最近更新 更多