9

私はmongodb + C#ドライバーを初めて使用するので、私の素朴さを許してください。

キーと値のペアのコレクションに対してバッチ挿入を実行しようとしています。そのため、データ構造のタイプは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 は、DocumentSerializationOptions ではなく、DictionarySerializationOptions 型のシリアル化オプションを予期していました。

設定がありませんか?

編集:詳細情報

私の辞書は私のエンティティです。つまり、プロパティを保持するオブジェクトを作成する代わりに、Dictionary. mongo のドキュメントから、これは mongo に変換する必要があるように見えますDocument

さらに編集:ツイスト質問

using ステートメントを次のように変更することで、挿入する単一のインスタンスを取得できました。

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 を維持しながら同じことを達成する方法はありますか?

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

4

1 に答える 1

15

を使用する新しいコードを使用する.Insertと、ドライバーはこれらの挿入をバッチ処理せずInsertBatch、 .

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

collection.InsertBatch(documents.Select(d => new BsonDocument(d)));
于 2012-08-22T21:46:57.920 に答える