Javascript 使用Mongoose更新包含唯一值的对象数组

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已经存在。这就像我试图创建一个重复的条目,而不仅仅是向数组中

我有一个集合中的文档,其中包含一个对象数组。数组中的每个对象都包含一个唯一的字段“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。我将创建一个关于如何解决它的答案,如果您不喜欢该解决方案,希望其他人会回答。