我在一个包含对象数组的集合中有文档。数组中的每个对象都包含一个唯一的字段“ clinic_id”。我也在使用mongoose-unique-validator。
我有一个Node路由,该路由接受JSON请求以将新对象推送到数组中。但是,只要阵列中存在现有对象,此操作就会失败。我在已经存在的对象上收到一个唯一的约束错误。例如,如果我在数组中具有一个带有临床编号1的对象,并且尝试为该临床编号2添加一个对象,那么我将收到一条错误消息,抱怨临床编号1已经存在。就像我在尝试创建重复项,而不仅仅是在数组中添加一个新的非重复对象一样。
猫鼬模式的示例:
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时...
其他信息:节点v10.15.1 /猫鼬5.2.1 / mongoose-unique-validator 2.0.2
答案 0 :(得分:1)
您应该使用以下属性创建一个新模型:
{
name: { type: String, required: true },
clinic_id: { type: String, unique: true, required: true },
type: { type: String }
}
现在,它变得更加容易,因为您不需要单独参考诊所。您可以在此文档上添加组织的ID,但我假设您根据原始实现不需要它。
创建诊所时,只需将ID添加到父文档(Org)。
您单位的字段将更改为:
branch: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Clinic'
}]
现在,每当创建一个分支时,您只需将结果对象(甚至不需要指定_id,它都会为您完成)推入正确的组织中,您将拥有所需的列表。 / p>
要查找分支机构时:
Org.find(condition).populate('branch')
,您将获得完全相同的结果。
现在,当我指的是mongoose
时,我的意思是如果您以如下方式导入它:
const mongoose = require('mongoose');