2017-11-20 2 views
5

私は投影で集計を実行しようとしていますが、私はNotSupportedException: $project or $group does not support <document>を取得します。私はmongodb v3.4でドライバのバージョン2.4.4を実行しています。

var filter = Builders<T>.Filter.Regex(x=>x.Value,"/test/gi"); 

var aggregate = collection.Aggregate() 
     .Match(filter) 
     .Project(x => new 
     { 
      Idx = x.Value.IndexOf("test"), 
      Result = x 
     }) 
     .SortBy(x => x.Idx); 

私はIndexOfCPsupportedあると思いました。

私はここで間違っていますか?

答えて

1

問題はIndexOfではなく、あなたの予測によって引き起こされます。射影はドキュメント自体を含むべきではありません。これはMongoDB .Netドライバではサポートされていません。 だから、投影にxオブジェクトを含むことなく、次のクエリではうまく動作します:

var aggregate = collection.Aggregate() 
     .Match(filter) 
     .Project(x => new 
     { 
      Idx = x.Value.IndexOf("test"), 
      // Result = x 
     }) 
     .SortBy(x => x.Idx); 

は、いくつかの可能な修正がここにあります。あなたは、ドキュメントオブジェクト自体を必要としますが、全体にコレクションをフェッチすることができれば

var aggregate = collection.Aggregate() 
    .Match(filter) 
    .Project(x => new 
    { 
     Idx = x.Value.IndexOf("test"), 
     Value = x.Value, 
     // ... 
    }) 
    .SortBy(x => x.Idx); 

:最良の選択ではない文書全体が、実際にはさらにロジックのために必要とされるフィールドだけ、例えば投影に含めることです

var aggregate = collection.Aggregate() 
    .Match(filter) 
    .ToList() 
    .Select(x => new 
     { 
      Idx = x.Value.IndexOf("test"), 
      Result = x 
     }) 
     .OrderBy(x => x.Idx); 

この方法は、サーバーとクライアントの両方が大量に読み込まれるため、最後のオプションとして使用してください。

+0

ユースケースは、最も一致するもの( 'Idx'による)が一番上に置かれているので、' Idx'はソート用です。重要なのは依然として実際の結果であり、ジェネリック型であるので、私は 'Id'と' Value'にしかアクセスできないので、オプション1が出ていると思います。 –

関連する問題