【发布时间】:2017-08-04 15:33:24
【问题描述】:
假设我有一个像这样的猫鼬模式:
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 操作的方法。其中一种方法是更新,其定义如下:
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。我认为,问题在于第二个代码块。可以查一下吗?
注意:
实际上,我的架构中的字段比我指定的要多得多。一些字段也引用了其他记录。
【问题讨论】:
-
似乎你想对
$set..stackoverflow.com/questions/286141/…的值使用这些技术之一 -
浏览答案和cmets,这似乎不是您的真实问题,如果属实,请更新您的问题,以便我们为您提供帮助。
标签: javascript node.js mongodb mongoose