2015-05-26 17 views
5

Mam problem z nowym sterownikiem MongoDB C# 2.0 i potokiem agregacji.Rozwiń następnie Agregacja grupy w MongoDB C#

Zasadniczo próbuję zwrócić najbardziej popularne elementy w polu tablicy na obiekcie. Typ pola to: IList<string> FavouritePlaceIds { get; set; }.

Mam następujący MongoDB agregację, która działa zgodnie z oczekiwaniami:

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

Jednak kwestia teraz próbuje tłumaczyć, że do kodu C# z wykorzystaniem nowego sterownika MongoDB 2.0. Używam na poniższy link w celu uzyskania pomocy z gazociągiem agregacji: http://mongodb.github.io/mongo-csharp-driver/2.0/reference/driver/crud/reading/#unwind

mam następujące pory dla mojego agregacji rurociągu:

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

Kiedy idę do kompilacji tego kodu, otrzymuję następujący komunikat:

'BsonDocument' does not contain a definition for 'FavouritePlaceIds' and no extension method 'FavouritePlaceIds' accepting a first argument of type 'BsonDocument' could be found...

błąd ma miejsce w pierwszym parametrem (i => i.FavouritePlaceIds) sposobu grupy().

Czytając notatki na link podany w sekcji grupy, wspomina, że:

Because $unwind is a type of projection, you must provide a return type.

Tak, jestem przy założeniu, że nie jestem podając prawidłowy typ zwrotny, dlatego to spodziewa się Obiekt BsonDocument i nie można skompilować.

Jak zatem określić poprawny typ zwrotu, który ma być użyty w metodzie grupy?

Odpowiedz

4

Kiedy pozwalasz Unwind wywnioskować parametry typu będzie użyć typu zbiórki TResult i BsonDocument dla TNewResult.

Jeśli chcesz używać określonego typu i nie BsonDocument trzeba dodać te parametry typu:

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

Jak zawsze, należy upewnić się, że operacja rzeczywiście zwraca coś, co może być tego typu.

+0

Czy muszę ustawić OriginalType i NewResultType na klasę, której pole jest członkiem lub typ pola? – Juzzbott

+0

@Juzzbott zdecydowanie nie jest takim typem pola. Typ 'OrignalType' powinien być typem kolekcji. 'NewResultType' powinien być typem projekcji tworzonej w' Unwind'. Powinien prawdopodobnie działać z tym samym oryginalnym typem. – i3arnon

+0

Klasa 'ApplicationUser' ma pole FavouritePlaceIds. Poniższe składniki zostaną teraz skompilowane, ale otrzymuję inny błąd: '.Unwind (i => i.FavouritePlaceIds)'. Komunikat o błędzie: Nie można przekształcić z postaci szeregowej "List " z BsonType 'String'. – Juzzbott

Powiązane problemy