Обновить массив объектов, содержащий уникальное значение, с помощью Mongoose

#javascript #node.js #mongodb #mongoose

#javascript #node.js #mongodb #mongoose

Вопрос:

У меня есть документы в коллекции, которые содержат массив объектов. Каждый объект в массиве содержит уникальное поле «clinic_id». Я также использую mongoose-unique-validator.

У меня есть маршрут узла, который принимает запрос JSON для отправки нового объекта в массив. Однако это приводит к сбою всякий раз, когда в массиве есть существующий объект. Я получаю ошибку уникального ограничения для уже существующего объекта (ов). Например, если у меня есть объект в массиве с clinic_id 1, и я попытаюсь добавить объект для clinic_id 2, я получу сообщение об ошибке, в котором сообщается, что clinic_id 1 уже существует. Это действует так, как будто я пытаюсь создать дублирующуюся запись, а не просто добавляю новый неповторяющийся объект в массив.

Пример схемы Mongoose:

   name: { type: String, required: true },
  org_id: { type: String, unique: true, required: true },     
  branch: [{
              name: { type: String, required: true },
              clinic_id: { type: String, unique: true, required: true },
              type: { type: String }
          } ]
  

Пример кода, содержащегося в маршруте узла, который пытается поместить новый объект в массив:

   const orgId = req.params.id;

  Org.findOne({ org_id: orgId }).then(org => {

    // Get org_id from URL and add to JSON body
    req.body.org_id = orgId;
    // Push Branch Object onto the array
    org.branch.push(req.body);

    org
      .save()
      .then(savedOrg => {
        res.json({ status: 'SUCCESS', id: savedOrg._id });
      })
      .catch(err => {
        const error = JSON.stringify(err);
        res.status(500).json({ status: 'ERROR', desc: error });
      });
  });
  

Текст ошибки, выданный mongoose-unique-validator:

{ ValidatorError: ошибка, которая, как ожидается, clinic_id будет уникальной. Значение: 100 при новой ошибке ValidatorError …

Дополнительная информация: Node v10.15.1 / mongoose 5.2.1 / mongoose-unique-validator 2.0.2

Комментарии:

1. Является ли branch собственной моделью, или вы пытаетесь сделать ее массивом объектов?

2. Массив объектов, содержащихся в организационной модели. Это работает просто отлично, если я добавляю все изначально. Но всякий раз, когда я пытаюсь добавить объект (содержащий другую ветвь) к массиву, происходит сбой, потому что clinic_id уже в массиве не проходит уникальную проверку.

3. Это потому, что на самом деле вы не должны использовать mongoose таким образом. Общая идея заключается в том, чтобы использовать mongodb на полную катушку. Я собираюсь создать ответ о том, как бы я решил это, и если вам не нравится решение, надеюсь, кто-нибудь другой ответит.

Ответ №1:

Вы должны создать новую модель со следующими свойствами:

 {
    name: { type: String, required: true },
    clinic_id: { type: String, unique: true, required: true },
    type: { type: String }
}
  

Теперь это еще проще, потому что вам не нужно ссылаться на клинику независимо. Вы могли бы добавить идентификатор организации в этот документ, но я предполагаю, что вам это не нужно, основываясь на вашей первоначальной реализации.

Когда вы переходите к созданию клиники, вы просто добавляете идентификатор в родительский документ (Org).

Поле в вашей организации изменится на:

 branch: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Clinic'
}]
  

Теперь, когда бы вы ни создавали ветку, вы просто помещаете результирующий объект (вам даже не нужно указывать _id, он сделает это за вас) в нужную организацию, и у вас будет нужный список.

Когда вы хотите найти ветви:

 Org.find(condition).populate('branch')
  

и вы получите точно такой же результат, какой хотите.

Теперь, когда я ссылаюсь на mongoose , я имею в виду, импортируете ли вы его как:

 const mongoose = require('mongoose');