使用Mongoose

时间:2019-03-14 17:50:08

标签: javascript node.js mongodb mongoose

我在一个包含对象数组的集合中有文档。数组中的每个对象都包含一个唯一的字段“ 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

1 个答案:

答案 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');