我正在尝试在更新功能期间迭代文档
User.prototype.update = function(user, done){
this.model.findOne({_id:user._id}, function(err, doc){
console.log(doc);
for(var i in doc){
if(user[i] != undefined && user[i] != doc[i]){
console.log('this value', i, user[i], user[i] === doc[i], doc[i]);
doc[i] = user[i];
}
}
console.log(doc[i]);
//doc.save(done);
});
}
然而这样做会捕获模型添加到对象的所有函数,例如_save,_done,_events和许多其他我不想检查的字段。
我也尝试添加if(user.hasOwnProperty(i)),但这不起作用。
更新:如果有人看到更好的方式让我知道,这是非常好的工作
User.prototype.update = function(user, done){
this.model.findOne({_id:user._id}, function(err, doc){
for(var i in doc._doc){
if(user[i] && user[i] != doc[i])
doc[i] = user[i]
}
doc.save(done);
});
}
答案 0 :(得分:2)
在你的情况下,查询返回MongooseDocument,这就是为什么你得到像_doc,save等属性,你应该使用lean - 如果你使用这个函数你得到普通的js对象而不是MongooseDocument ..
this.model.findOne({_id:user._id}).lean().exec(function(err, doc){
// ..
});
或使用toObject
this.model.findOne({_id:user._id}, function(err, doc){
for (var i in doc.toObject()) {
console.log(i);
}
});
答案 1 :(得分:0)
请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
keys = Object.keys(doc); // returns an array of keys
keys.forEach(function(key{
if (typeof doc[key] !== 'function' && user[key] && doc[key] !== user[key] ) {
// do what you want here
}
})
这应该让你开始。如果doc[key]
或user[key]
是对象,则won't相等。谷歌的javascript对象平等'找到适合你的解决方案。