2011-06-27 6 views
3

"products"コレクションの要素は、Mongoによって生成された構造体で、結果のデータをコレクションにダンプするmap reduceジョブを実行しています。それが制御できれば)気づいていない:理想的MongoDB - C#のmap-reduceコレクションのマッピング

{ 
    "_id" : { "ProductId" : "1:000001", "ProductTitle" : "Some product with ID 1:000001" }, 
    "value" : { "TotalImpressions" : 3, "TotalClicks" : 40 } 
} 

、私は次の平らなオブジェクトへの各エントリをマップしたい:

public class Product 
{ 
    public string ProductId { get; set; } 
    public string ProductTitle { get; set; } 
    public int TotalImpressions { get; set; } 
} 

シリアライザは、プロパティを探し、これは明らかに動作しません」そのクラスには存在しないルートレベルの "id"と "value"があります。彼らが表示されるように私の場所に持っている問題を回避するには、罰金にマッピング

public class ProductRow 
{ 
    /* implementation of these objects excluded, but they just reflect the json objects */ 
    public ProductIdentifier Id { get; set; } 
    public Product value { get; set; } 
} 

は、しかし、それは少し冗長だと私はむしろ、すべてのそれらの余分のオブジェクトを避けるだろう:例えば、オブジェクトをモデル化することです。

このマッピングをサポートするようにBSONデシリアライザを設定することはできますか。私はドキュメントを見てきましたが、明らかな解決策は見当たりませんでした。

注意:私は、作業環境によって.NET 3.5に制限されています。そのため、回答を検討する際には、そのことを覚えておいてください。

+0

は、あなただけの後、製品のインスタンスに自分を型指定されていない結果をマップすることはできません。クエリ?なぜあなたはBSONデシリアライザでこれをやりたいのですか?それは厳密にその仕事ではありません... – Avish

+0

はい、私は手動で行うことができます、これは有効なポイントです - ありがとう。しかし、私はこれがデシリアライザの機能ではないということに同意します。それはまさにドメインの問題ですが、私が受け入れるものは間違いなく事実であるため、実装される可能性は低いです。 – gooid

答えて

3

あなたは簡単に(@Avishが示唆したように)ので、ここでは、自分自身を直列化復元行うことができますが、あなたのケースのための完全な例です:

var mongoServer = MongoServer.Create("mongodb://localhost:27020"); 
var database = mongoServer.GetDatabase("StackoverflowExamples"); 
var products = database.GetCollection("products"); 

var result = new Product(); 

var item = products.FindOne(); 
var id = item["_id"].ToBsonDocument(); 
var value = item["value"].ToBsonDocument(); 

result.ProductId = id["ProductId"].AsString; 
result.ProductTitle = id["ProductTitle"].AsString; 
result.TotalImpressions = value["TotalImpressions"].AsInt32; 
関連する問題