2017-05-19 15 views
0

ここに私のコードです。 DbContext.Resourcesは非常に構造化されていないため、IMongoCollection<dynamic>です。.NET MongoDbドライバで動的型のObjectIdを解析する方法

var resource = await DbContext.Resources.Find(
    Builders<dynamic>.Filter.Eq("_id", ObjectId.Parse(id)) 
).SingleAsync(); 

し、得られresourceオブジェクト

[{ 
    "_id": { 
    "timestamp":1487967980, 
    "machine":614561, 
    "pid":30862, 
    "increment":16022269, 
    "creationTime":"2017-02-24T20:26:20Z" 
    }, 
    ... 
}] 

この_idを解析するためのベストプラクティスは何ですか?ですか

+0

私はこれを聞くことができますか? C#ドライバを使ってすべてのser/deserを処理するBSONライブラリを使用していますか? https://www.nuget.org/packages/MongoDB.Bson/? – Veeram

+0

はい、私はv = 2.4.3を使用しています –

+0

唯一の問題は何も注釈を付けないことです。タイプは動的です。クラスはありません。 –

答えて

2

ObjectIdを表現して構成する方法は複数あります。

  • timestamp(int型)
  • machineハッシュ:オブジェクトは、あなたがhereを見て、次のフィールドで構成することができ、コンストラクタを使用してエンコードしてデータベースに見ている実際の_id値に対応するあなたのIMongoCollectionから返されます(INT)
  • pid(ショート)
  • increment(INT)

ObjectIdToStringメソッドを実装し、オブジェクトを文字列表現に変換できるようにする必要がありますが、何らかの理由で動的タイピングのために使用できない場合は、コンストラクタで新しいものを作成するか、 ObjectId.Packメソッドを使用すると、timestampmachinepidおよびincrementを、ObjectIdの作成にも使用できるバイト配列に変換することができます。

+0

多数の結果を持つクエリでこれを処理する最良の方法はありますか? .ToString()を1000レコードごとに呼び出すと、重大なパフォーマンス上の問題が発生することが懸念されます。 –

+2

複数のリソースを調べた後、アノテーションを使用することをお勧めします。あなたの場合はそれが可能ではないので、あなたのコレクションを反復処理し、すべてのアイテムに対して 'ToString'を実行するための小さなラッピング関数を実行します。 1000アイテムがポイントパフォーマンスを下回るのは問題になります。 –

関連する問題