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

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

{
  "personId": 13998272,"address": [
    {
      "addresstype": "HOME","streetNo": 21,"addressLine1": "LORRAINE AVENUE","addressLine2": "EDGEWATER","city": "KINGSTON","parish": "ST ANDREW","country": "JAMAICA","qscore": 0.9,"modifiedDate": "2019-02-17 15:24:19"
    }
  ],"phone": [
    {
      "originalNumber": "+18767842983","phoneNumberIFormat": "+18768514679","phoneNumberLFormat": "8768514679","qualityscore": 0.8,"dataSource": "PERSON","modifiedDate": "2018-12-17 09:42:31"
    }
  ],"email": [
    {
      "emailAddress": "neilagreen78@yahoo.com","dataSource": "FINACLE","qualityscore": 0.89,"modifiedDate": "2018-12-17 09:38:41"
    }
  ]
}

我的架构在下面的代码片段中定义以供参考:

const contactSchema = new mongoose.Schema({
  pid: Number,address: [
    new mongoose.Schema({
      addresstype: String,streetNo: String,addressLine1: String,addressLine2: String,city: String,parish: String,country: String,qscore: String,modifiedDate: String
    })
  ],phone: [
    new mongoose.Schema({
      originalNumber: String,phoneNumberIFormat: String,phoneNumberLFormat: String,qualityscore: Number,dataSource: String,email: [
    new mongoose.Schema({
      emailAddress: String,modifiedDate: String
    })
  ]
});

如何在不覆盖其他文档的情况下更新每个嵌入式文档数组?

假设请求是和地址和电子邮件对象但不是电话,我该如何处理?

解决方法

你可以尝试这个..

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

N.B:您必须进行一些验证才能检查请求正文以确保不会发送不需要的属性.您可以使用像Joi这样的包

const getContact = await contact.findOne({ id: req.params.id });

let query = { $addToSet: {} };
  for (let key in req.body) {
    if (getContact[key] && getContact[key] !== req.body[key])// if the field we have in req.body exists,we're gonna update it
      query.$addToSet[key] = req.body[key];
  }

  const contact = await Customer.findOneAndUpdate(
    { pid: req.params.id },query,{new: true}
  );

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...