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;