假设我有一个像这样的猫鼬模式:
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);
我使用变量 Test 声明 CRUD 操作的方法。其中一种方法是 update,其定义如下:
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
);
};
现在,我在节点路由器中使用此方法,如下所示:
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 吗?我不希望它像这样工作。我希望如果我的属性为空,那么该属性不应包含在记录中。
如果您还记得,我在更新之前已通过控制台记录了 UpdatedValues。 (请参阅有问题的第二个代码块)。因此,这是记录的值:
{
"_id" : ObjectId("ns8f9yyuo32hru0fu23oh"), //some automatically generated id
"name" : "firstTest"
}
我不知道为什么,但 nickName 不存在于记录的值中,然后更新后我得到nickName: null
。我认为,问题出在第二个代码块上。您能检查一下吗?
Note:
实际上,我的模式中的字段比我在问题中指定的字段多得多。某些字段也引用其他记录。