Javascript 使用Mongoose更新包含唯一值的对象数组
我有一个集合中的文档,其中包含一个对象数组。数组中的每个对象都包含一个唯一的字段“clinic_id”。我还使用mongoose唯一验证器 我有一个节点路由,它接受一个JSON请求,将一个新对象推送到数组中。但是,只要阵列中存在现有对象,此操作就会失败。我在已经存在的对象上获得唯一约束错误。例如,如果我在数组中有一个对象的clinic_id为1,并且我尝试为clinic_id 2添加一个对象,我将收到一个错误,抱怨clinic_id 1已经存在。这就像我试图创建一个重复的条目,而不仅仅是向数组中添加一个新的非重复对象 猫鼬模式的一个示例:Javascript 使用Mongoose更新包含唯一值的对象数组,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我有一个集合中的文档,其中包含一个对象数组。数组中的每个对象都包含一个唯一的字段“clinic_id”。我还使用mongoose唯一验证器 我有一个节点路由,它接受一个JSON请求,将一个新对象推送到数组中。但是,只要阵列中存在现有对象,此操作就会失败。我在已经存在的对象上获得唯一约束错误。例如,如果我在数组中有一个对象的clinic_id为1,并且我尝试为clinic_id 2添加一个对象,我将收到一个错误,抱怨clinic_id 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唯一验证程序产生的错误文本:
{ValidatorError:错误,预期clinic\u id
是唯一的。值:
100
新验证程序错误时
其他信息:节点v10.15.1/mongoose 5.2.1/mongoose unique validator 2.0.2您应该创建具有以下属性的新模型:
{
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,它会为您完成)推送到正确的组织中,就可以得到所需的列表
如果要查找分支,请执行以下操作:
Org.find(condition).populate('branch')
你会得到你想要的完全相同的结果
现在,当我提到猫鼬时,我的意思是如果你像这样导入它:
const mongoose = require('mongoose');
分支是它自己的模型,还是你想让它成为一个对象数组?一个包含在组织模型中的对象数组。如果我最初添加所有内容,它就可以正常工作。但是每当我尝试附加一个对象(包含另一个分支)时对于阵列,它会失败,因为阵列中已经存在的clinic_id无法进行唯一验证。这是因为您不应该以这种方式使用mongoose。总体思路是最大限度地使用mongodb。我将创建一个关于如何解决它的答案,如果您不喜欢该解决方案,希望其他人会回答。