为什么我似乎无法将普通对象合并到Mongo文档中?

时间:2015-06-01 03:47:45

标签: node.js mongodb mongoose underscore.js lodash

我有来自第三方服务器的数据Feed,我正在拉入并转换为JSON。数据源永远不会包含我的mongoDB自动生成的_id,但是有一个名为vehicle_id的唯一标识符。

下面的函数是处理数据馈送生成的json对象fresh_event_obj并将其值复制到mongo文档中的情况,如果有一个mongo文档具有相同的vehicle_id

function update_vehicle(fresh_event_obj) {
    console.log("Updating Vehicle " + fresh_event_obj.vehicleID + "...");

    Vehicle.find({ vehicleID: fresh_event_obj.vehicleID }, function (err, event_obj) {
      if (err) {
        handle_error(err);
      } else {
        var updated = _.merge(event_obj[0], fresh_event_obj);

        updated.save(function (err) {
          if (err) {
            handle_error(err)
          } else {
            console.log("Vehicle Updated");
          }
        });

      }
    });
  }

event_obj[0]fresh_event_obj的结构完全相同,只是event_obj[0]_id__v,而“普通”对象没有。

当我在这两个上运行_.merge,或者甚至是我自己的递归函数,只是将后者的值复制到前者时,updated对象中的任何内容都与event_obj[0]不同,尽管fresh_event_obj拥有所有新值。

有谁知道我做错了什么?我觉得很明显,我只是没有看到它。

1 个答案:

答案 0 :(得分:1)

问题是,如果您没有在架构中定义属性,并且它们尚不存在,则无法使用

创建它们
doc.prop = value

即使您的架构中有{strict:false}也是如此。

设置新属性的唯一方法是执行

doc.set('prop', value)

(如果您的架构中不存在该属性,您的架构中仍需要{strict:false}

至于要在模式中定义太多属性,您始终可以使用for-in循环来遍历对象属性

for(key in fresh_event_obj)
    event_obj.set(key, fresh_event_obj[key]);