Mongoose嵌套的对象数组中的唯一值
对于我的项目,我想为组织团体保留一份mongoose文件,就像这样:
var groupSchema = Schema({ name : { type : String }, org : { type : Schema.Types.ObjectId, ref : 'Organization' }, ... users : [{ uid : { type : Schema.Types.ObjectId, ref : 'User' }, ... }] });
我想阻止同一个用户在同一个组中两次。 要做到这一点,我需要强制users.uid在用户数组中是唯一的。 我试着说“唯一:真正的”为uid,但这并不奏效。 有没有办法做到这一点与mongoose或mongoDB没有额外的查询或拆分架构?
编辑:我改变了以前的uid值为uid:{type:Schema.Types.ObjectId,ref:'User',index:{unique:true,dropDups:true}}但是,这似乎并不奏效。
编辑:假设没有简单的方法来实现这一点,我添加了额外的查询检查用户是否已经在组中。 这在我看来是最简单的方法。
数组字段上的唯一索引强制相同的值不能出现在集合中多个文档的数组中,但不会阻止相同的值在单个文档的数组中出现多次。 所以你需要确保唯一性,而不是添加元素到数组中。
仅当该值不存在时,才使用$addToSet
运算符将值添加到数组中。
Group.update({name: 'admin'}, {$addToSet: {users: userOid}}, ...
但是,如果users
数组包含具有多个属性的对象,并且您希望确保唯一性(在本例中为uid
),那么您需要采取另一种方法:
var user = { uid: userOid, ... }; Group.update( {name: 'admin', 'users.uid': {$ne: user.uid}}, {$push: {users: user}}, function(err, numAffected) { ... });
只要user.uid
不存在于任何users
元素的uid
字段中, $push
更新的限定条件就是限制。 所以它模仿$addToSet
行为,但只是用于。