当前位置:  开发笔记 > 编程语言 > 正文

mongoose对子文档属性强制执行唯一属性

如何解决《mongoose对子文档属性强制执行唯一属性》经验,为你挑选了1个好方法。

我无法分辨为什么在这些情况下不验证唯一属性

var UserSchema = new mongoose.Schema({
  name: { type: String},
  email: { type: String, unique: true, required: true },
});

var CustomerSchema = new mongoose.Schema({
   name: { type: String, unique: true, required: true },
   users:[UserSchema],
});

当我将新用户推送到客户用户数组时,我可以使用相同的电子邮件属性添加相同的用户,而不会引起我期望的重复错误.

如果未提供属性值但必需属性,则必需属性会引发错误

这是预期的行为吗?

例如:

var customer = new Customer();
customer.name = 'customer_name';
customer.save(...);

for(var i = 0; i < 10; i++){
   var user = new User();
   user.email = 'mg@google.com';
   customer.users.push(user);
   customer.save(...);
}

robertklep.. 5

在MongoDB的文档说明:

唯一约束适用于集合中的单独文档.也就是说,唯一索引可防止单独的文档对索引键具有相同的值,但索引不会阻止文档使索引数组中的多个元素或嵌入文档具有相同的值.

由于您正在处理嵌入式文档,因此无法对同一父文档的嵌入文档数组中的属性强制实施唯一性.

但是,当您随后尝试Customer使用也具有mg@google.com电子邮件地址的用户插入新内容时,您将收到错误(但仅在保存时,而不是在使用时.push(),因为MongoDB强制执行唯一性,而不是Mongoose).



1> robertklep..:

在MongoDB的文档说明:

唯一约束适用于集合中的单独文档.也就是说,唯一索引可防止单独的文档对索引键具有相同的值,但索引不会阻止文档使索引数组中的多个元素或嵌入文档具有相同的值.

由于您正在处理嵌入式文档,因此无法对同一父文档的嵌入文档数组中的属性强制实施唯一性.

但是,当您随后尝试Customer使用也具有mg@google.com电子邮件地址的用户插入新内容时,您将收到错误(但仅在保存时,而不是在使用时.push(),因为MongoDB强制执行唯一性,而不是Mongoose).

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有