【发布时间】:2014-08-08 18:33:29
【问题描述】:
我有这些架构:
var userSchema = new mongoose.Schema({
username: {type: String,unique: true}
});
mongoose.model( 'User', userSchema );
var fooSchema = new mongoose.Schema({
title : {type: String,trim: true},
owner : {type: mongoose.Schema.Types.ObjectId, ref: 'User'}
});
fooSchema.index({ title: 1, owner: 1 }, { unique: true }); //does not work
mongoose.model( 'Foo', fooSchema);
我想使用验证,那么每个 foo 可以有唯一的标题和唯一的用户
我试过了
fooSchema.index({ title: 1, owner: 1 }, { unique: true });
但如果另一个用户创建具有相同标题的新 foo 也会出现错误
更新:
我将unique: true 添加到username,但我有同样的问题
【问题讨论】:
-
看来您真正想要的是“标题”和“用户名”的独特组合。由于您选择了参考设计而不是嵌入式,因此实际数据位于单独的集合中。除了将“用户名”指定为该模型的唯一性(您可能想要)之外,这使得该任务变得不可能。
-
@NeilLunn 为什么我必须添加唯一的用户名? userSchema 的 ObjectId 是唯一的
-
因为当您添加“Brad”,然后再次添加“Brad”作为用户名时,每次都会获得不同的 ObjectId 值。除非“用户名”实际上是唯一的。派生案例,但您应该明白这一点。
-
with
usernameunique 我有同样的问题 -
unique的验证方式与其他验证不同,而是执行您遇到的操作并从 mongo 返回 E11000 重复错误。如果您想在保存之前验证唯一性,则需要在pre过滤器中查找重复文档。 This question 演示了如何,或者有一个 plugin 封装了该模式。