Javascript Mongoose:仅更新未定义/不存在的属性,并允许现有的未修改属性

Javascript Mongoose:仅更新未定义/不存在的属性,并允许现有的未修改属性,javascript,node.js,json,mongodb,mongoose,Javascript,Node.js,Json,Mongodb,Mongoose,假设我在mongo中有以下数据: {name: "peter", jobTitle: "engineer", id: 17, webs:[]} 我从他那里得到了更多信息,所以我想更新不存在的属性: 新数据: {id:17, jobTitle: "gdkjd", phone:"+397373888348", mail:"hello@example.org", webs:["one&qu

假设我在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"]}
有没有一种方法可以在不单独检查已设置哪些属性的情况下获取此信息

注意:向数组中添加值而不覆盖它的想法特别复杂。因此,请不要想象我的原始阵列是:

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

因此,通过此“非破坏性更新”,我希望数据库具有以下功能:


Web:[“两个”、“三个”、“一个”]

对于非数组字段,可以使用管道形式的update和
$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"}}
                     ]
)

什么版本的MongoDB?Mongo4.2.8 mongoose 5.9.19真棒!数组不起作用,如果旧值有一个空数组,就不会有新项出现:(我这样做:const company=await company.findOneAndUpdate({id:result.id},[{$set:{webs:{$concatarray:[“$webs”),result.webs],},},},{$set:{$newDoc:{$mergeObjects:[result,$$ROOT]}},{$replaceRoot:{newRoot:$newDoc},},].exec();嗯,如果以前的
站点
为空,可能会出现这种情况。也许将$push与$each一起使用会更好?$push不是聚合运算符,因此不起作用。也许是条件运算符。是的,尝试过,但push没有起作用!但多亏了你,我开始理解逻辑(我是mongo新手)