То, что я пытаюсь сделать, должно быть прямым, но по некоторым причинам у меня есть реальные трудности, чтобы понять это.У меня есть следующие схемы Mongoose (упрощенно).
var Status = new Schema({
name : { type: String, required: true },
description : { type: String }
});
var Category = new Schema({
statuses : [Status], // contains a list of all available statuses
// some other attributes
});
var Book = new Schema({
statuses : [Status], // preferably this would not be an array but a single document, but Mongoose doesn't seem to support that
// some other attributes
});
Теперь я хочу сделать следующее:
- Получить документ категории
- Найти конкретныйвнедренный документ статуса (на основе параметра запроса)
- Назначить этот конкретный внедренный документ статуса конкретному документу Book.Я хочу заменить существующий статус Книги, так как в любой момент времени для книги должен быть установлен только один статус.
Вот что я сейчас делаю:
mongoose.model('Category').findOne({_id: id}, function(err, category){
if(err) next(err);
var status = category.statuses.id(statusId); // statusId available via closure
book.statuses[0] = status; // book available via closure; trying to replace the existing status here.
book.save(function(err){
if(err) next(err);
next();
});
});
Выше, кажется, работает нормально, и я не получаю никаких ошибок.Однако новый статус не сохраняется в документе.В следующий раз, когда я выведу обновленный документ Book, он все еще будет иметь старый статус.Я отладил это, и методы find (), а также установка состояния, кажется, в порядке.
Единственное, о чем я могу думать сейчас, это то, что каким-то образом значение статуса, которое я назначаю, находится не в том формате, который будет сохранен с Mongoose.Хотя я бы ожидал какое-то сообщение об ошибке.
А может, в любом случае, есть лучший способ сделать все это?