我正在使用Mongoose执行以下操作:
that.model.update({_id: dao._id}, dao, { upsert: true }, cb);
其中dao
是一个猫鼬表示,其中包含(除其他外)一些嵌入式文档。作为测试,我在调用上面的update-method之前从数组中删除了几个嵌入式文档。
结果是嵌入式文档数组的更改不会持久存在。
我忽略了什么?
答案 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之间进行这种分离,不要问。
这意味着getById
,getAll
和repo的所有其他公共接口都与domainobjects一起工作,而不是与mongoose-objects一起使用。
在repo上执行add
或update
这样的事情时,内部只会更新内存缓存(同样只使用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);