迭代通过MongoDB的条目的JavaScript节点

问题描述:

我想通过一个文档遍历我的更新功能时迭代通过MongoDB的条目的JavaScript节点

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)),但不起作用。

UPDATE:这工作很漂亮,如果有人看到一个更好的方式去了解它让我知道

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

是的,我使用猫鼬 – Snymax 2014-12-05 16:49:37

+0

我认为更好的使用toObject – 2014-12-05 19:00:48

+0

你是非常好的先生谢谢你的指出。当我阅读关于它的文档时,我完全误解了它,尽管它设置了保存对象的方法。谢谢你指出。 – Snymax 2014-12-06 00:27:42

在你的情况下,查询返回MongooseDocument,这就是为什么你得到像_doc性质,保存等对,你应该使用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); 
    } 
}); 

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对象平等'来找到一个适合你的解决方案。