更新Mongoose中已更改嵌入文档的项目时,这些嵌入式文档不会更新

时间:2012-08-21 16:33:00

标签: mongodb mongoose

我正在使用Mongoose执行以下操作:

that.model.update({_id: dao._id}, dao,  { upsert: true }, cb);

其中dao是一个猫鼬表示,其中包含(除其他外)一些嵌入式文档。作为测试,我在调用上面的update-method之前从数组中删除了几个嵌入式文档。

结果是嵌入式文档数组的更改不会持久存在。

我忽略了什么?

2 个答案:

答案 0 :(得分:1)

很难确定是否会看到更多代码,但如果dao是Mongoose模型实例,则应该改为调用dao.save(cb);

答案 1 :(得分:0)

我通过执行以下问题中提出的类似问题来解决问题:https://github.com/LearnBoost/mongoose/issues/571

为了完整性,一些导致问题的背景。

我正在使用在app-start上填充的DDD存储库。在引擎盖下,这会获取Mongoose对象(在我的情况下它们被称为DAO)并被转换为domainobjects,它们被缓存在存储库中。我需要在domainobjects和mongoose-objects之间进行这种分离,不要问。

这意味着getByIdgetAll和repo的所有其他公共接口都与domainobjects一起工作,而不是与mongoose-objects一起使用。

在repo上执行addupdate这样的事情时,内部只会更新内存缓存(同样只使用domainobjects而不是mongoose-objects)

只有在repo上执行commit时,才会保留可能更改的domainobjects集合。这是通过创建新的Mongoose对象而不是获取现有的mongoose对象并更新它们来完成的。

这就是为什么我不能使用dao.save(),因为当我保存一个不同的(刚刚​​创建的)mongoose-object而具有相同id的mongoose-object可能已经存在于Mongo中时,它会抛出重复的ID错误。

代码说明解决方案的一些相关代码段:

  

var dao = that.createDAO(domainobject);

      //https://github.com/LearnBoost/mongoose/issues/571
      // Convert the Model instance to a simple object using Model's 'toObject' function
      // to prevent weirdness like infinite looping...
      var upsertData = dao.toObject();

      // Delete the _id property, otherwise Mongo will return a "Mod on _id not allowed" error
      delete upsertData._id;

      that.model.update({_id: dao._id}, upsertData,  { upsert: true }, cb);