2015-12-20 46 views
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 = '[email protected]'; 
    customer.users.push(user); 
    customer.save(...); 
} 

回答

3

MongoDB documentation解释:

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

由于您正在处理嵌入式文档,因此无法在同一父文档的嵌入式文档的数组内执行唯一性。

但是,当您随后尝试插入一个新的Customer与也有[email protected]作为电子邮件地址的用户,你将得到一个错误(但只有当储蓄,而不是使用.push()时,因为唯一性是由MongoDB的强制执行,而不是猫鼬)。