#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');