验证由其父级在mongoose中作用域的嵌入式文档的唯一性

时间:2012-12-17 01:29:32

标签: mongodb mongoose

我在mongoose中有以下架构:

UserSchema = new Schema
    username: {type: String, required: true}

GameSchema = new Schema
    identifier: String
    users: [UserSchema]

我想确保游戏中的每个用户都拥有唯一的用户名。但是,如果我添加

unique: true

到用户名定义,然后它似乎强制所有游戏的唯一性,而不仅仅是在用户所在的游戏中。此外,如果我有超过1个没有用户的游戏,那么我会收到以下错误:

games.$users.username_1  dup key: { : null }

我尝试在用户名字段中添加一个自定义验证器来手动检查该用户名是否已经在父游戏的范围内进行,但在mongoose中,验证器函数只接收用户名的实际字符串,所以我不这样做有任何方法可以检查用户名在游戏中是否唯一,因为我无法在验证器功能中获得对父游戏文档的引用。

有没有办法在mongoose中完成这种验证?

2 个答案:

答案 0 :(得分:2)

正如您所发现的,向数组字段添加唯一索引不会强制数组中的唯一性,它确保集合中没有两个文档包含相同的字段值阵列。

相反,将$addToSet数组运算符看作是一种原则上将数值添加到数组中的方法,只有它不在数组中。

答案 1 :(得分:1)

这可以通过以下方式轻松实现:

doc.array.addToSet(4,5);

您可以执行以下操作删除它们:

doc.array.pull(4,5);
doc.array.remove(4,5); //alias of .pull()

http://mongoosejs.com/docs/api.html#types_array_MongooseArray-addToSet http://mongoosejs.com/docs/api.html#types_array_MongooseArray-pull