0

所以我有一个带有嵌套配置文件属性的用户模式,我想确保当配置文件属性存在时所有配置文件 ID 都是唯一的:

UserSchema = new Schema {
    ...
    ...
    profile : {
        id : {
           type : String
           unique : true
           sparse : true
        }
        ...
        ...
    }
}

然而,在运行我的测试时,我可以使用相同的 profile.id 值保存两个不同的用户。嵌套文档是否没有强制执行唯一属性?我错过了什么吗?

打开日志记录后,我可以看到这样的输出(我已经删除了大部分字段):

Mongoose: users.ensureIndex({ email: 1 }) { safe: undefined, background: true, unique: true }  
Mongoose: users.insert({ profile: { id: '31056' }) {}  
Mongoose: users.ensureIndex({ 'profile.id': 1 }) { safe: undefined, background: true, sparse: true, unique: true }  
Mongoose: users.insert({ profile: { id: '31056' }) {}

仍在插入重复值。

4

2 回答 2

1

也许它仅在嵌套属性内验证为唯一。我从不相信unique自己,总是去手动验证,这样我就可以拥有更多的控制权:

从来没有在 Mongoose 中处理过嵌套文档,也不太确定它是否会起作用,但至少让你有一个想法:

User.schema.path('profile.id').validate(function(value, respond) {  
  mongoose.models["User"].findOne({ profile.id: value }, function(err, exists) {
    respond(!!exists);
  });
}, 'Profile ID already exists');
于 2013-04-02T21:12:30.823 回答
0

Aaron的建议修复了由异步创建的索引引起的竞争条件。我等待执行我的用户模式的单元测试,直到发出索引事件:

User.on('index', function (err) { ... })
于 2013-04-05T03:25:35.487 回答