猫鼬唯一在对象的子项目中不起作用,即使我使用addToSet

时间:2019-02-18 21:12:45

标签: mongoose mongoose-schema

我尝试使我的模式起作用,但:(

Schema({
  name: String
  text: [
    {
      name: String,
      language: {
        type: String,
        required: true,
        unique: true
      }
    }
  ]
})

如果我希望他们不能以相同的语言添加2个文本,我该怎么办?

let texte = [
    { name: "first", language: "English" },
    { name: "duplicate", language: "English" }
  ];
  newData.text.addToSet(texte[0]);
  newData.text.addToSet(texte[1]);
  newData.text.addToSet(texte[1]);

如果我用相同的语言推送重复的文本,我不会出错

    {
  "_id": "5c6aff3e6c895637094427d7",
  "text": [
    {
      "_id": "5c6aff3e6c895637094427d8",
      "name": "first",
      "language": "English"
    },
    {
      "_id": "5c6aff3e6c895637094427d9",
      "name": "duplicate",
      "language": "English"
    },
    {
      "_id": "5c6aff3e6c895637094427da",
      "name": "duplicate",
      "language": "English"
    },
  ],
  "name": "test"
}

我希望有办法:(

1 个答案:

答案 0 :(得分:0)

将unique设置为true不会在创建或更新之前检查数据库中是否有重复数据。在创建或更新文档之前,您必须检查自己。将unique设置为true会为mongodb中的该字段添加唯一索引。它的用法不是您的想法。

您可以做的是首先运行查询,以检查文档是否已经存在且您要唯一的字段。

Colection.find({ "text.name": "duplicate", "text.language": "English" })
 .then(doc => {
   if(doc) {
     // handle duplicate case

   } else {
    // create new

   }
 })

或者,如果要在将数据保存到数据库之前对其进行验证,则可以使用诸如JOI之类的验证库。这将处理您用于处理模式验证的大多数用例。