我正在尝试使用 Mongoose 在模式的两个字段上创建索引,这两个字段在 MongoDB 中是唯一且稀疏的,如下所示:
var ArraySchema = new Schema ({
user_id: {type: mongoose.Schema.Types.ObjectId, ref:'User'},
event_id: {type: mongoose.Schema.Types.ObjectId, ref:'Event'}
}, {_id:false});
ListSchema.index({user_id:1, event_id:1}, {sparse:true, unique:true});
然后在用户模式的数组中使用它:
var User = new Schema({
arrayType1 : {
type: [ArraySchema]
},
arrayType2 : {
type: [ArraySchema]
},
arrayType3 : {
type: [ArraySchema]
}
//More specifications for user schema...
});
但是,当尝试在没有 array
字段的情况下保存多个用户时,重复字段会引发错误。 Mocha 中的错误类似于:array.event_id_1 dup key {null, null}
。将引发此错误的代码段示例如下:
var user1, user2;
user1 = new User({
username : 'username1',
password : 'password'
});
user2 = new User({
username : 'username2',
password : 'password'
});
user1.save(function() {
user2.save();
});
我的理由是使 ArraySchema 的字段唯一且稀疏:如果指定了 array
字段,我不希望数组包含重复的对象;但是,array
字段不是必需的,因此会有很多用户对此字段设置null
。显然我不能使用字段级索引,因为有多个字段需要索引(arrayType1
、arrayType2
、arrayType3
)。
最佳答案
似乎不支持做这种事情,至少目前是这样。另一种方法是在这些字段上创建一个复合索引,然后每当向该字段添加新元素时使用 user.arrayType1.addToSet()
。这是一个如何工作的示例:
数组架构:
var ArraySchema = new Schema ({
user_id: {type: mongoose.Schema.Types.ObjectId, ref:'User'},
event_id: {type: mongoose.Schema.Types.ObjectId, ref:'Event'}
}, {_id:false});
ListSchema.index({user_id:1, event_id:1});
用户架构:
var User = new Schema({
arrayType1 : {
type: [ArraySchema]
},
arrayType2 : {
type: [ArraySchema]
},
arrayType3 : {
type: [ArraySchema]
}
//More specifications for user schema...
});
然后我可以像往常一样声明新用户(就像我在问题中所做的那样);但是,当我想向 arrayType1
添加一个新元素时,例如,我将使用以下代码行添加到新元素 only 如果它还不存在:
user.arrayType1.addToSet({user_id : user2._id, event_id : event._id});
user.save(function(err, result) {
//Callback logic.
};
其中 user2
和 event
在代码的前面定义并保存到数据库中。或者,我可以这样使用 Mongoose 的更新功能:
User.update({_id : user._id}, {
$addToSet : {
arrayType1 : {
user_id : user2._id,
event_id : event._id
}
}
}, function(err) {
//Callback logic.
}
);
关于node.js - 唯一和稀疏模式级索引 MongoDB 和 Mongoose,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26876369/