Обновление встроенного документа Mongoose - PullRequest
10 голосов
/ 04 ноября 2011

У меня проблема с обновлением встроенного документа.

Мои определенные схемы:

var Talk = new Schema({
    title: {
        type: String,
        required: true
    },
    content: {
        type: String,
        required: true
    },
    date: {
        type: Date,
        required: true
    },
    comments: {
        type: [Comments],
        required: false
    },
    vote: {
        type: [VoteOptions],
        required: false
    },
});

var VoteOptions = new Schema({
    option: {
        type: String,
        required: true
    },
    count: {
        type: Number,
        required: false
    }
});

Теперь я хотел бы обновить vote.count++, с указанным Talk идентификатором и VoteOption Я бы.У меня есть следующая функция, чтобы сделать работу:

function makeVote(req, res) {

    Talk.findOne(req.params.id, function(err, talk) {
        for (var i = 0; i < talk.vote.length; i++) {
            if (talk.vote[i]._id == req.body.vote) {
                talk.vote[i].count++;

            }
        }
        talk.save(function(err) {
            if (err) {
                req.flash('error', 'Error: ' + err);
                res.send('false');
            } else {
                res.send('true');
            }
        });
    });
}

Все выполняется, я получаю res.send('true'), но значение на счет не меняется.

Когда я сделал некоторые console.log Я видел, что это изменило значение, но talk.save просто не сохраняет его в дБ.

Также я очень недоволен циклом, чтобы найти _id встроенного документа.В документации по мангусте я читал о talk.vote.id(my_id), но это дает мне ошибку из-за отсутствия функции id.

Ответы [ 2 ]

19 голосов
/ 06 декабря 2011

При обновлении типа Mixed (который кажется чем-то иным, кроме базового типа, включая также встроенные документы), необходимо вызвать .markModified в документе.В этом случае это будет:

talk.markModified("vote"); // mention that `talk.vote` has been modified

talk.save(function(err) {
    // ...
});

Надеюсь, это поможет кому-то в будущем, поскольку я не смог найти ответ очень быстро.


Ссылка:

... Mongoose теряет возможность автоматического обнаружения / сохранения этих изменений.Чтобы «сообщить» Mongoose, что значение смешанного типа изменилось, вызовите метод .markModified(path) документа, передающего путь к смешанному типу, который вы только что изменили.

0 голосов
/ 29 ноября 2011

Это потому, что вы пытаетесь сохранить объект разговора до обратного вызова, приращение которого увеличивается. Кроме того, вы удостоверились, что создали экземпляр своей схемы Talk? например:

var talk = new Talk();

Однако, если все, что вам нужно, это увеличить значение переменной count, mongo поддерживает атомарные обновления на месте, которые могут оказаться полезными:

talk.find( { _id : req.body.vote }, { $inc: { count : 1 } } );

взгляните на: http://www.mongodb.org/display/DOCS/Updating#Updating-%24inc

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