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在用户数组中是唯一的。 我试着说“唯一的:真正的”,但没有奏效。 有没有办法做到这一点与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行为,但只是用于。