Node.js 使用mongoose更新具有多个嵌入文档数组的mongodb文档

Node.js 使用mongoose更新具有多个嵌入文档数组的mongodb文档,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,假设我有一个如下所示的文档: { “personId”:13998272, “地址”:[ { “地址类型”:“主页”, “街号”:21, “地址线1”:“洛林大道”, “addressLine2”:“EDGEWATER”, “城市”:“金斯敦”, “教区”:“圣安德鲁”, “国家”:“牙买加”, “qScore”:0.9, “修改日期”:“2019-02-17 15:24:19” } ], “电话”:[ { “原始编号”:“+18767842983”, “PhoneNumberFormat”:

假设我有一个如下所示的文档:

{
“personId”:13998272,
“地址”:[
{
“地址类型”:“主页”,
“街号”:21,
“地址线1”:“洛林大道”,
“addressLine2”:“EDGEWATER”,
“城市”:“金斯敦”,
“教区”:“圣安德鲁”,
“国家”:“牙买加”,
“qScore”:0.9,
“修改日期”:“2019-02-17 15:24:19”
}
],
“电话”:[
{
“原始编号”:“+18767842983”,
“PhoneNumberFormat”:“+18768514679”,
“PhoneNumberFormat”:“8768514679”,
“质量分数”:0.8,
“数据源”:“人”,
“修改日期”:“2018-12-17 09:42:31”
}
],
“电子邮件”:[
{
“电子邮件地址”:”neilagreen78@yahoo.com",
“数据源”:“FINACLE”,
“质量分数”:0.89,
“修改日期”:“2018-12-17 09:38:41”
}
]

}
使用mongoose,您可以使用$push将对象推送到数组中。查询将类似于:

(保存地址和电子邮件,查询pid)

{“pid”:1}是要更新的对象的pid

{$push:{email:emailToPush,address:addressToPush}}是要在每个数组上推送的对象

然后,您必须使用中间件或类似的东西过滤请求主体。我通常使用中间件检查请求是否正确,如:

编辑:

这将生成您的查询对象(更新函数的第二个参数)。

您可以尝试此操作

获取contact对象的结构,然后检查req.body中发送了哪些属性,并相应地构建查询

注意:您必须进行一些验证来检查请求主体,以确保没有发送不需要的属性。你可以使用像这样的软件包


const getContact=await contact.findOne({id:req.params.id});
let query={$addToSet:{};
用于(让输入请求正文){
if(getContact[key]&&getContact[key]!==req.body[key])//如果req.body中的字段存在,我们将更新它
查询.$addToSet[key]=请求主体[key];
}
const contact=wait Customer.findOneAndUpdate(
{pid:req.params.id},
查询
{新:正确}

);如果请求仅包含地址、电话或电子邮件,因此没有,该怎么办?我如何动态地处理每个请求,而不知道身体中到底会有什么?太好了!这应该行得通。。但是为什么不使用addToSet而不是push呢?这正是我想要的。谢谢
db.getCollection("contactSchema").update({"pid":1}, {$push: {email: emailToPush, 
address:addressToPush}})
const buildQuery = (requestBody) => {
    let query = {$push: {}};
    Object.keys(requestBody).map(key => {
        query.$push[key] = requestBody[key];
    });
}