我正在使用 Mongoose 执行以下操作:
that.model.update({_id: dao._id}, dao, { upsert: true }, cb);
dao
包含(除其他外)几个嵌入式文档的猫鼬表示在哪里。作为测试,在调用上面的更新方法之前,我从数组中删除了几个嵌入式文档。
结果是对嵌入式文档数组的更改没有保留。
有什么我忽略的吗?
很难确定没有看到更多代码,但如果dao
是 Mongoose 模型实例,您应该dao.save(cb);
改为调用。
我通过执行以下问题中提出的类似操作解决了该问题:https ://github.com/LearnBoost/mongoose/issues/571
为了完整起见,一些导致问题的背景。
我正在使用在应用程序启动时填充的 DDD 存储库。在后台,这会获取 Mongoose 对象(在我的情况下被视为 DAO)并被转换为缓存在存储库中的域对象。我需要域对象和猫鼬对象之间的这种分离,不要问。
这意味着getById
,getAll
以及 repo 的所有其他公共接口都可以使用域对象而不是 mongoose 对象。
add
当做类似或在 repo 上的事情update
时,这只会在内部更新 in-mem 缓存(同样,它只使用 domainobjects 而不是 mongoose-objects)
只有在commit
repo 上进行操作时,可能更改的域对象集合才会被持久化。这是通过创建新的猫鼬对象而不是获取现有的猫鼬对象并更新它们来完成的。
这就是为什么我不能使用的dao.save()
原因,因为当我保存一个不同的(刚刚创建的)猫鼬对象而具有相同 ID 的猫鼬对象可能已经存在于 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);