13

新しい C# 2.0 MongoDB ドライバーと集計パイプラインに問題があります。

基本的に、オブジェクトの配列フィールド内で最も人気のある要素を返そうとしています。フィールド タイプは次のとおりIList<string> FavouritePlaceIds { get; set; }です。

期待どおりに機能する次の MongoDB 集計があります。

db.users.aggregate([
    { $unwind : "$FavouritePlaceIds" },
    { $group: { "_id": "$FavouritePlaceIds", "count": {$sum: 1}}}, 
    { $sort : { "count": -1 }}
])

ただし、問題は現在、新しい MongoDB ドライバー 2.0 を使用して、それを C# コードに変換しようとしています。集計パイプラインのヘルプとして、次のリンクを使用しています: http://mongodb.github.io/mongo-csharp-driver/2.0/reference/driver/crud/reading/#unwind

これまでのところ、集計パイプラインには次のものがあります。

var pipeline = usersCollection.Aggregate()
                .Unwind(i => i.FavouritePlaceIds)
                .Group(i => i.FavouritePlaceIds, g => new { FavouritePlaceIds = g.Key, Count = g.Count() })
                .SortByDescending(i => i.Count);

そのコードをコンパイルしようとすると、次のメッセージが表示されます。

「BsonDocument」には「FavouritePlaceIds」の定義が含まれておらず、タイプ「BsonDocument」の最初の引数を受け入れる拡張メソッド「FavouritePlaceIds」が見つかりませんでした...

i => i.FavouritePlaceIdsGroup() メソッドの最初のパラメーター ( ) でエラーが発生しています。

グループセクションの下にあるリンクのメモを読むと、次のことが言及されています。

$unwind はプロジェクションの一種であるため、戻り値の型を指定する必要があります。

したがって、正しい戻り値の型を指定していないと想定しているため、BsonDocument オブジェクトが必要であり、コンパイルに失敗しています。

では、Group メソッドで使用する正しい戻り値の型を指定するにはどうすればよいでしょうか?

4

1 に答える 1

10

型パラメーターを推測させるUnwindと、 コレクション型 forTResultおよびBsonDocumentforが使用されTNewResultます。

特定の型を使用したいがBsonDocument、これらの型パラメーターを追加する必要がない場合:

var pipeline = usersCollection.Aggregate()
    .Unwind<OriginalType, NewResultType>(....

いつものように、操作が実際にその型の何かを返すことを確認する必要があります。

于 2015-05-26T05:58:07.567 に答える