2014-11-11 3 views
1

Я пытаюсь создать индекс на двух полях схемы, которые должны быть уникальными и редкими в MongoDB используя Mongoose следующим образом:Уникальный и разреженных схемы уровня индекса 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).

ответ

1

Похоже, что делать такие вещи не поддерживается, по крайней мере, в это время. Альтернативой будет создание составного индекса в этих полях, а затем при добавлении нового элемента в поле используйте 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 определены ранее в коде и сохраняются в db. В качестве альтернативы я мог бы использовать функцию обновления Mongoose как таковую:

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

Это был мой ответ тоже :) –

 Смежные вопросы

  • Нет связанных вопросов^_^