迭代mongodb入口javascript节点

时间:2014-12-05 16:31:23

标签: javascript node.js mongodb mongoose

我正在尝试在更新功能期间迭代文档

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);
    });
}

2 个答案:

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