Предположим, что у меня есть схема мангуста:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var testSchema = new Schema({
name: {type: String, required: true},
nickName: {type: String}
});
var Test = module.exports = mongoose.model('Test', testSchema);
Объявляю методы работы CRUD с помощью переменной Test. Из этого один такой метод является обновлением, которое определяется следующим образом:
module.exports.updateTest = function(updatedValues, callback) {
console.log(updatedValues); //this output is shown below
Test.update(
{ "_id": updatedValues.id },
{ "$set" : { "name" : updatedValues.name, "nickName" : updatedValues.nickName } },
{ multi: false },
callback
);
};
Теперь я использую этот метод внутри моего маршрутизатора node следующим образом:
router.put('/:id', function(req, res, next) {
var id = req.params.id,
var name = req.body.name,
var nickName = req.body.nickName
req.checkBody("name", "Name is required").notEmpty();
var errors = req.validationErrors();
if(errors) { ........ }
else {
var testToUpdate = new Test({
_id: id,
name: name,
nickName: nickName || undefined
});
Test.updateTest(testToUpdate, function(err, result) {
if(err) { throw(err); }
else { res.status(200).json({"success": "Test updated successfully"}); }
});
}
});
Теперь, если я сохраню новую запись в базе данных и затем увижу ее в базе данных, она выглядит так:
{
"_id" : ObjectId("ns8f9yyuo32hru0fu23oh"), //some automatically generated id
"name" : "firstTest",
"__v" : 0
}
Теперь, если я обновляю один и тот же документ без изменения чего-либо, а затем, если я посмотрю на ту же запись в базе данных, я получаю:
{
"_id" : ObjectId("ns8f9yyuo32hru0fu23oh"), //some automatically generated id
"name" : "firstTest",
"__v" : 0,
"nickName" : null
}
Вы видите, что для nickName установлено значение null? Я не хочу, чтобы он работал так. Я хочу, чтобы, если мое свойство равно null, это свойство не должно быть включено в запись.
Если вы помните, у меня консоль зарегистрировала обновленные версии перед ее обновлением. (см. второй блок кода). Итак, вот зарегистрированные значения:
{
"_id" : ObjectId("ns8f9yyuo32hru0fu23oh"), //some automatically generated id
"name" : "firstTest"
}
Я не знаю почему, но nickName не присутствует в зарегистрированных значениях, а затем после обновления я получаю nickName: null
. Я думаю, проблема заключается во втором блоке кода. Можете ли вы проверить его?
Примечание:
На самом деле у меня в моей схеме больше полей, чем указано в вопросе. Некоторые поля также относятся к другим записям.