Обновите документ mongodb, содержащий несколько массивов встроенных документов, используя mongoose - PullRequest
0 голосов
/ 26 февраля 2019

Скажите, что у меня есть документ, который выглядит следующим образом:

{
  "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,
      modifiedDate: String
    })
  ],
  email: [
    new mongoose.Schema({
      emailAddress: String,
      dataSource: String,
      qualityScore: Number,
      modifiedDate: String
    })
  ]
});

Как обновить каждый массив встроенных документов, не перезаписывая другие?

Скажем, запрос с адресом и объектом электронной почты, но не с телефоном, как быЯ справлюсь с этим?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Вы можете попробовать это ..

Получить структуру контактного объекта, а затем проверить, какие свойства были отправлены в req.body и построить запрос соответственно.

NB: У вас должна быть некоторая проверка, чтобы проверить тело запроса и убедиться, что нежелательные свойства не отправлены.Вы можете использовать пакет как Джой

   
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}
  );
0 голосов
/ 26 февраля 2019

С помощью mongoose вы можете использовать $ push для перемещения объекта в массив.Запрос будет выглядеть так:

(сохранение адреса и электронной почты, запрос по pid)

db.getCollection("contactSchema").update({"pid":1}, {$push: {email: emailToPush, 
address:addressToPush}})

{"pid": 1} - это pid объекта, который вы хотите обновить;

{$ push: {email: emailToPush, address: addressToPush}} - это объект, который вы хотите поместить в каждый массив

Затем необходимо отфильтровать тело запроса с помощью промежуточного программного обеспечения.или что-то типа того.Я обычно использую промежуточное ПО для проверки правильности запроса, например:

РЕДАКТИРОВАТЬ:

const buildQuery = (requestBody) => {
    let query = {$push: {}};
    Object.keys(requestBody).map(key => {
        query.$push[key] = requestBody[key];
    });
}

Это создаст ваш объект запроса (второй параметр функции обновления).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...