2017-01-30 3 views
1

Die Zeilenstruktur in MongoDB ist wie folgt:Wie Wert erhalten von verschachtelten KeyValuePair von IMongoCollection

{ 
"_id" : ObjectId("588b0fe98dc6911c54a43be6"), 
"GrId" : 1, 
"GrTitle" : "GrTitle", 
"ServiceType" : 1, 
"Url" : "https://twitter.com/xxxxxxxxxx", 
"PublishedDate" : ISODate("2017-01-27T09:15:08.000Z"), 
"ScrappedDate" : ISODate("2017-01-27T09:16:25.097Z"), 
"Keyword" : "keyword", 
"ItemId" : "123123", 
"SearchType" : 2, 
"Content" : "content", 
"SocialData" : [ 
    { 
     "k" : "Retweets", 
     "v" : 0 
    }, 
    { 
     "k" : "Favorites", 
     "v" : 1 
    } 
    ] 
} 

Ich möchte die Werte von SocialData, Gruppe von PublishedDate erhalten. Mein Code in diesem Moment wie folgt aussieht:

var filter = collection.Aggregate() 
      .Match(r => r.PublishedDate <= to) 
      .Match(r => r.PublishedDate >= from); 

     if (serviceType.HasValue) 
      filter = filter.Match(r => r.ServiceType == serviceType); 

     if (gameId.HasValue) 
      filter = filter.Match(r => r.GrId == gameId.Value); 

     return filter 
      .Group(
       r => new 
       { 
        groupedYear = r.PublishedDate.Year, 
        groupedMonth = r.PublishedDate.Month, 
        groupedDay = r.PublishedDate.Day, 
        itemId = r.ItemId, 
       }, 
       g => new 
       { 
        Key = g.Key, 
        RetweetsValue = g.FirstOrDefault().SocialData.Select(s => new KeyValuePair<string, int>(s.Key, s.Value)).FirstOrDefault(k => k.Key == "Retweets").Value 
       }) 
      .Project(
       r => new ChartSummary 
       { 
        SocialMedia = r.RetweetsValue, 
        Day = r.Key.groupedDay, 
        Month = r.Key.groupedMonth, 
        Year = r.Key.groupedYear, 
       }) 
      .ToList(); 

Ich erhalte Ausnahme, dass FirstOrDefault() nicht unterstützt wird, so wie soll ich abrufen diese Daten?

+0

[Dies] (http://stackoverflow.com/questions/31171451/getting-a-single-object-from- mongodb-in-c-sharp) Frage könnte helfen. – RandomStranger

+0

Ich glaube nicht, dass es möglich ist, es war schon eine ähnliche Frage: http://StackOverflow.com/Questions/41902613/what-is-the-c-sharp-equivalent-of-Push-and-root-for -mongodb/41903581 # 41903581 Ich würde das ganze Wörterbuch und Filter auf der Client-Seite bekommen. Oder ist ein SocialMedia wirklich riesiges Wörterbuch? –

+0

@MaksimSimkin abhängig von 'ServiceType' SocialData ist maximal 5 Elemente, also ist es nicht riesig und Schlüssel sind einzigartig. –

Antwort

1

Ich denke nicht, MongoDrive könnte es in Abfrage übersetzen. Wenn Socialmedia ist nicht sehr hige würde ich ganzen Wörterbuch bekommen und filtere es auf Client-Seite:

return filter 
      .Group(
       r => new 
       { 
        groupedYear = r.PublishedDate.Year, 
        groupedMonth = r.PublishedDate.Month, 
        groupedDay = r.PublishedDate.Day, 
        itemId = r.ItemId, 
       }, 
       g => new 
       { 
        Key = g.Key, 
        RetweetsValue = g.First().SocialData 
       }) 
      .Project(
       r => new 
       { 
        SocialMedia = r.RetweetsValue, 
        Day = r.Key.groupedDay, 
        Month = r.Key.groupedMonth, 
        Year = r.Key.groupedYear, 
       }) 
      .ToList()    
      .Select(
      r => new ChartSummary 
      { 
       SocialMedia = r.SocialMedia.FirstOrDefault(x=>x.Key=="Retweets").Value, 
       Day = r.Day, 
       Month = r.Month, 
       Year = r.Year 
      }); 
+0

Vielen Dank, wie ich sagte SocialData ist meiner Meinung nach kleine Wörterbuch, so dass diese Lösung gut zu mir passen sollte. –

+0

@TomaszKowalczyk Sie sind willkommen, wenn es Ihnen geholfen hat, werde ich dankbar sein für ein upvote :) –

Verwandte Themen