Как поместить внедренный документ из одного документа в другой документ с помощью Mongoose? - PullRequest
0 голосов
/ 25 мая 2011

То, что я пытаюсь сделать, должно быть прямым, но по некоторым причинам у меня есть реальные трудности, чтобы понять это.У меня есть следующие схемы 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
});

Теперь я хочу сделать следующее:

  1. Получить документ категории
  2. Найти конкретныйвнедренный документ статуса (на основе параметра запроса)
  3. Назначить этот конкретный внедренный документ статуса конкретному документу 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.Хотя я бы ожидал какое-то сообщение об ошибке.

А может, в любом случае, есть лучший способ сделать все это?

1 Ответ

0 голосов
/ 06 июля 2011

Это может быть связано с тем, что вы пытаетесь скопировать внедренный документ, с которым может быть связан ObjectId. Попытка сохранить дубликат Status в Book создаст два встроенных документа с одинаковым ObjectId. Попробуйте создать новый объект Status и скопировать поля.

Трудно найти документы на ObjectsId s для встроенных документов, но они упоминаются здесь: http://mongoosejs.com/docs/embedded-documents.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...