独特和稀疏的模式级索引MongoDB和Mongoose
我试图创build一个模式的两个领域的索引,在MongoDB中使用Mongoose是唯一和稀疏的,如下所示:
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
)。
至less在这个时候,似乎做这样的事情是不被支持的。 另一种方法是在这些字段上创build一个复合索引,然后每当向该字段添加一个新元素时使用user.arrayType1.addToSet()
。 这是一个如何工作的例子:
ArraySchema:
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
,例如,我会使用下面的代码行添加到新的元素, 只是如果它不在那里:
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. } );