我无法分辨为什么在这些情况下不验证唯一属性
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).
在MongoDB的文档说明:
唯一约束适用于集合中的单独文档.也就是说,唯一索引可防止单独的文档对索引键具有相同的值,但索引不会阻止文档使索引数组中的多个元素或嵌入文档具有相同的值.
由于您正在处理嵌入式文档,因此无法对同一父文档的嵌入文档数组中的属性强制实施唯一性.
但是,当您随后尝试Customer
使用也具有mg@google.com
电子邮件地址的用户插入新内容时,您将收到错误(但仅在保存时,而不是在使用时.push()
,因为MongoDB强制执行唯一性,而不是Mongoose).