Powiedz, że mam dokument, który wygląda tak:

{
  "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"
    }
  ]
}

Moje schemat jest zdefiniowany w fragmencie kodu poniżej w celach informacyjnych:

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
    })
  ]
});

Jak zaktualizować każdą tablicę osadzonych dokumentów bez nadpisywania innych?

Powiedz, że prośba jest z obiektem i adresem e-mail, ale nie telefon, jak mogłem sobie z tym poradzić?

3
O'Dane Brissett 26 luty 2019, 20:22

2 odpowiedzi

Najlepsza odpowiedź

Możesz spróbować tego ..

Uzyskaj strukturę obiektu kontaktowego, a następnie sprawdzenie, aby zobaczyć, jakie właściwości zostały wysłane w Req.body i odpowiednio wygody zapytanie.

N.B: Musisz mieć pewne walidacja, aby sprawdzić korpus żądania, aby zapewnić wysłanie żadnych niechcianych właściwości. Możesz użyć pakietu takiego jak 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}
  );
3
O'Dane Brissett 27 luty 2019, 17:35

Z Mongoose można użyć $ Push, aby popychać obiekt do tablicy. Zapytanie będzie jak:

(Zapisywanie adresu i e-maila, zapytanie na PID)

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

{"PID": 1} jest PID obiektu, który chcesz zaktualizować;

{$ Push: {Email: EmailTopush, Adres: AdresToPush}} To obiekt, który chcesz naciskać na każdej tablicy

Następnie musisz filtrować ciało prośby o oprogramowanie pośredniego lub coś takiego. Zwykle używam oprogramowania pośredniego, aby sprawdzić, czy żądanie jest poprawna, jak:

EDYTOWAĆ:

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

Spowoduje to zbudowanie obiektu zapytania (drugi parametr funkcji aktualizacji).

3
MatteoPHRE 27 luty 2019, 08:31