2012-08-22 8 views
9

私はmongodb + C#ドライバを初めて使用しています。MongoDB C#ドライバ - Dictionaryのリストを使用してInsertBatchを行う方法<string、string>

私はキーと値のペアのコレクションにバッチインサートをしようとしています。そのような私のデータ構造はタイプList<Dictionary<string,string>>です。私はシリアル化についてのエラーを取得する

public void Persist(string collectionName, List<Dictionary<string, string>> documents) 
{ 
    string connectionString = ConfigurationManager.ConnectionStrings[CONNECTION_STRING_KEY].ConnectionString; 
    MongoServer server = MongoServer.Create(connectionString); 
    MongoCredentials credentials = new MongoCredentials("MYUser", "MyPassword"); 
    MongoDatabase myDb = server.GetDatabase("myDb", credentials); 

    var collection = myDb .GetCollection(collectionName); 

    using (server.RequestStart(myDb)) 
    { 
    var result = collection.InsertBatch(documents); 
    } 
} 

:ここ

は私の永続化コードのサンプルです

MongoDB.Bson.BsonSerializationException:シリアライザ DictionarySerializerは、 型DictionarySerializationOptionsのシリアル化のオプションは期待できませんDocumentSerializationOptions。

設定がありません。

EDIT:詳細情報

私の辞書は私の実体です。つまり、プロパティを保持するオブジェクトを作成する代わりに、Dictionaryにダンプするだけです。 mongoのドキュメントから、これはちょうどmongo Documentに変換する必要があるように表示されます。

FURTHER EDIT:ツイスト質問

私が使用してステートメントを変更して挿入するために、単一のインスタンスを取得することができました:

using (server.RequestStart(myDb)) 
    { 
    foreach(var doc in documents) 
     collection.Insert(new BsonDocument(doc)); 
    //var result = collection.InsertBatch(typeof(Dictionary<string, string>), documents); 
    } 

しかし、私の懸念は現実のシナリオの下で以来、パフォーマンスです私は簡単に10k +辞書を持っています。このコードを使用すると、ドライバはこれらをバッチ処理するのに十分スマートですか? InsertBatchを維持する方法はありますか?同じことを達成していますか?

もちろん、どんな助けでも大歓迎です。

答えて

15

.Insert、ドライバがするないバッチこれらのインサートを使用して、あなたの新しいコードを使用すると、あなたはInsertBatchよりも大幅にパフォーマンスが低下を取得します。

代わりにこれを試してみてください:

collection.InsertBatch(documents.Select(d => new BsonDocument(d))); 
+1

を私が探していたまさに!ありがとうございました! – OnResolve

関連する問題