5

我在猫鼬中有以下模式:

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 }

我尝试将自定义验证器添加到用户名字段以手动检查该用户名是否已经在父游戏的范围内,但是在猫鼬中验证器函数只接收用户名的实际字符串,所以我没有任何办法检查用户名在游戏中是否唯一,因为我无法在验证器函数中获得对父游戏文档的引用。

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

4

2 回答 2

5

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

取而代之的是,将$addToSet数组运算符视为一种仅在数组中还没有值的情况下自动将值添加到数组的方法。

于 2012-12-17T02:03:52.420 回答
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

于 2014-06-07T05:15:47.450 回答