2016-12-21 9 views
1

MatchフェーズのFilterDefintionとグループフェーズのProjectionDefinitionを使用して、2.2バージョンのドライバを使用して集約クエリを作成しようとしています。しかし、ProjectionDefinitionの作成方法はあまりよく分かりません。 APIは次のようなものです:Mongodbグループ集約C#ドライバでProjectionDefinitionを使用する

FilterDefinition<T> filter=Builders<T>.Filter.Eq("Foo","Bar"); 
ProjectionDefinition<T> projection=... 
IAggregateFluent<T> aggr = fileCol.Aggregate<T>() 
      .Match(filter) 
      .Group(projection); 

マッチフィルタは通常の検索と同様に動作します。しかし、私はどのように投影を作成するか分からない。

通常のBsonドキュメントを作成してその段階に置くことができ、正常に動作します。しかし、私はビルダーから来た強く型付けされたオブジェクトを使用して一貫したインターフェースを作成しようとしています。そして、これは私がそれを行う方法を理解できない1つの場所です。 APIが存在するので可能だと思います。

(グループフェーズのBSONドキュメントは次のように行うことができる):

projection = new BsonDocument("_id","$SomeIdField"). 
    Add("Result",new BsonDocument("$max","$someNumberField")); 

EDIT: のMongoDB API Iは、以下のリンクされているを参照しています、と私は、当該箇所を引用しました。提供される例はありません。私は 'GroupDefinition'がより理にかなっていると思うが、私はそれを書かなかった:-)そして、強く型付けされると、BsonDocumentではなく、何かの戻り値で型付けされることを意味する。

http://api.mongodb.com/csharp/current/html/M_MongoDB_Driver_AggregateFluentBase_1_Group__1.htm

BLOCKQUOTE

public abstract IAggregateFluent<TNewResult> Group<TNewResult>(
    ProjectionDefinition<TResult, TNewResult> group 

パラメータ

型:MongoDB.Driver.ProjectionDefinition < TResult、TNewResult>

グループ投影。

タイプパラメータ

TNewResult

ステージの結果のタイプ。

BLOCKQUOTE

+0

'ProjectionDefinition'をチェックアウト?それは正しいとは言えません。マッチのような自分のステージ。 btw 'BsonDocument'は強く型付けされています。そのちょうどキー値のペア 'BsonDocument'があなたのオブジェクトであり、私はアキュムレータ演算子のためにあなたが既に使用できるラッパーを持っていると思います。 – Veeram

+0

@SagarReddy、私はそれが紛らわしいことに同意しますが、それはmdbドキュメントが持っている方法です。私は質問の関連セクションをリンクしています。 –

答えて

2

MongoDB .NET Driver: aggregation groupためのテストファイルであるAggregateGroupTranslatorTests.cs上のいくつかの素晴らしい例があります。例えば

、あなたはこのクラス定義がある場合:

public class ExampleGroup 
{ 
    [BsonId] 
    public ObjectId Id {get;set;} 
    public string SomeStringField { get; set; } 
    public int SomeNumberField {get; set;} 
} 

をそして、あなたは

{ _id: "$SomeStringField", Result: { "$max": "$SomeNumberField" } } 

のグループ化を実行したいと思いますあなたは以下のように実行することができる:

var result = collection.Aggregate() 
         .Group(
          x => x.SomeStringField, 
          g => new { 
            Result = g.Select(
              x => x.SomeNumberField 
              ).Max() 
          } 
         ).ToList(); 
result.ForEach(doc => Console.WriteLine(doc.ToJson())); 

上記のスニペットは.Net 4.5、MongoDB 3.4、MongoDB .Net/C#Driver v2.3でテストされました。私はあなたがv2.2を使っていることは知っていますが、プロジェクト定義グループの変更はありません。

また他のLINQトランスレータ試験グループ化段階におけるMongoDB.Driver.Tests/Linq/Translators

+0

強く型付けされた例を使用していただきありがとうございます。 –

+0

私はこの質問が答えられたことを忘れました。私はLINQを使用しないことを好むだろうが、私は元の投稿でそれを言っていない。 –

関連する問題