node.js – NodeJS Mongoose:更新Mongoose模型上的所有字段

我正在使用Node,MongoDB和Mongoose构建api.有一件事让我发现,你似乎不能一次设置多个字段:

app.put('/record/:id', function(req, res) {
  Record.findById(req.params.id, function(err, doc) {
    if (!err) {
      doc.update(req.params);
      doc.save();
...

但是,您似乎必须制定更新查询并在“模型”对象而不是文档对象上运行它.除非要分配个别属性,否则在最后运行save().

有没有办法完成这个,而不必写一个Mongo查询?

jsaak的答案是好的,但不适用于嵌套对象.我通过搜索和设置嵌套对象来阐述他的答案.

我将这些函数添加到一个utility.js文件中

var _ = require('underscore');

exports.updateDocument = function(doc, SchemaTarget, data) {
    for (var field in SchemaTarget.schema.paths) {
       if ((field !== '_id') && (field !== '__v')) {
            var newValue = getObjValue(field, data);
            console.log('data[' + field + '] = ' + newValue);
            if (newValue !== undefined) {
                setObjValue(field, doc, newValue);
          }  
       }  
    }
    return doc;
};

function getObjValue(field, data) {
    return _.reduce(field.split("."), function(obj, f) { 
        if(obj) return obj[f];
    }, data);
}

function setObjValue(field, data, value) {
  var fieldArr = field.split('.');
  return _.reduce(fieldArr, function(o, f, i) {
     if(i == fieldArr.length-1) {
          o[f] = value;
     } else {
          if(!o[f]) o[f] = {};
     }
     return o[f];
  }, data);
}

实施为:

var util = require('./utility');

app.put('/record/:id', function(req, res) {
  Record.findById(req.params.id, function(err, doc) {
    if (!err) {
      utils.updateDocument(doc, Record, req.params);
      doc.save();
    ...
相关文章
相关标签/搜索