2011-11-21 12 views
6

VS C#collection.Save:MongoDBのC#のドキュメントからの挿入+更新

保存方法は、挿入および更新の組み合わせです。ドキュメントのIDメンバに値がある場合は、既存のドキュメントとみなされ、ドキュメント上にSave呼び出しUpdate(実際には新しいドキュメントである場合に備えてUpsertフラグを設定します)。

私のIDは、すべてのドメインオブジェクトが継承する基本クラスに手動で作成しています。だから私のすべてのドメインオブジェクトは、MongoDBに挿入されたときにIDを持っています。

私はcollection.Saveを使用してインターフェイスをシンプルにするか、実際にはSave-call(Upsertフラグ付き)でオーバーヘッドが発生するのですか?そうではなく、collection.InsertとUpdateを使用する必要がありますか?

私が考えているのは、Saveメソッドが最初にUpdateメソッドを呼び出していて、新しいオブジェクトが最初に存在しなかったことがわかり、代わりにInsertを呼び出すということです。私が間違っている?誰かがこれをテストしましたか?

注:InsertBatchを使用してバルクデータを挿入するので、この場合大きなデータ処理は問題になりません。

編集は、

をフォローアップ私は挿入が良いかもしれないので、アップサートフラグを呼び出すアップデートは、いくつかのオーバーヘッドを持っていたかどうかを調べるために小さなテストを書きました。彼らは同じスピードで走っていることが分かった。以下の私のテストコードを参照してください。 MongoDbServerとIMongoDbServerは、ストレージ機能を分離するための独自の汎用インターフェースです。

IMongoDbServer server = new MongoDbServer(); 
Stopwatch sw = new Stopwatch(); 
long d1 = 0; 
long d2 = 0; 
for (int w = 0; w <= 100; w++) 
{ 
    sw.Restart(); 
    for (int i = 0; i <= 10000; i++) 
    { 
     ProductionArea area = new ProductionArea(); 
     server.Save(area); 
    } 
    sw.Stop(); 
    d1 += sw.ElapsedMilliseconds; 
    sw.Restart(); 
    for (int i = 0; i <= 10000; i++) 
    { 
     ProductionArea area = new ProductionArea(); 
     server.Insert(area); 
    } 
    sw.Stop(); 
    d2 += sw.ElapsedMilliseconds; 
} 
long a1 = d1/100; 
long a2 = d2/100; 

答えて

12

保存方法はありませんは、サーバーへの2回の旅行をするつもりです。

ヒューリスティックはこれです:保存されているドキュメントに_idフィールドの値がない場合は、その値が生成され、次にInsertが呼び出されます。保存されている文書が_idに0以外の値を持つ場合、UpdateはUpsertフラグを指定して呼び出されます。この場合、InsertまたはUpdateを実行するかどうかはサーバーによって決まります。

UpsertがInsertよりも高価なのかどうかわかりません。私は彼らがほとんど同じだと思うし、本当に重要なことは、それが単一のネットワーク往復のいずれかの方法だということです。

新しい文書であることがわかっている場合は、Insertを呼び出すこともできます。また、InsertBatchを呼び出す方法は、の方法では多くの個々のインサートを呼び出すよりも優れています。だから間違いなく保存するためにInsertBatchを好む。

関連する問題