独特和稀疏的模式级索引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 。 显然,我不能使用字段级索引,因为有多个字段需要一个索引( arrayType1arrayType2arrayType3 )。

至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. }; 

其中user2event在代码的前面定义并保存到数据库。 或者我可以使用Mongoose的更新函数:

 User.update({_id : user._id}, { $addToSet : { arrayType1 : { user_id : user2._id, event_id : event._id } } }, function(err) { //Callback logic. } );