私はマングースを使って次のことをしています:
that.model.update({_id: dao._id}, dao, { upsert: true }, cb);
dao
(とりわけ)いくつかの埋め込みドキュメントを含むマングース表現はどこにありますか。テストとして、上記のupdate-methodを呼び出す前に、配列からいくつかの埋め込みドキュメントを削除しました。
その結果、埋め込みドキュメントの配列への変更は永続化されません。
私が見落としているものはありますか?
より多くのコードが表示されないかどうかを確認するのは難しいですが、がマングースモデルインスタンスの場合は、代わりdao
に呼び出す必要があります。dao.save(cb);
次の問題で提案されているのと同様のことを行うことで問題を解決しました:https ://github.com/LearnBoost/mongoose/issues/571
完全を期すために、問題につながった背景。
アプリの起動時に入力されるDDDリポジトリを使用しています。内部的には、これはMongooseオブジェクト(私の状況ではDAOとして扱われます)をフェッチし、リポジトリにキャッシュされるドメインオブジェクトに変換されます。domainobjectsとmongoose-objectsをこのように分離する必要があります。質問しないでください。
これはgetById
、、getAll
およびリポジトリの他のすべてのパブリックインターフェイスが、mongoose-objectsではなくdomainobjectsで機能することを意味します。
リポジトリのようなことを行うとき、add
またはupdate
リポジトリ上で、これは内部的にのみin-memキャッシュを更新します(これも、mongoose-objectsではなくdomainobjectsのみを使用します)
リポジトリで実行する場合にのみ、commit
変更された可能性のあるドメインオブジェクトのコレクションが永続化されます。これは、既存のマングースオブジェクトをフェッチして更新する代わりに、新しいマングースオブジェクトを作成することによって行われます。
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);