2017-01-30 11 views
1

Структура строки в MongoDB выглядит следующим образом:Как получить значение из вложенного KeyValuePair из 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 
    } 
    ] 
} 

Я хотел бы получить значения из SocialData, группы по PublishedDate. Мой код на данный момент выглядит следующим образом:

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(); 

Я получаю исключение, что FirstOrDefault() не поддерживается, так как я должен получить эти данные?

+0

[Это] (http://stackoverflow.com/questions/31171451/getting-a-single-object-from- mongodb-in-c-sharp) вопрос может помочь. – RandomStranger

+0

Я не думаю, что это возможно, это был аналогичный вопрос: http://stackoverflow.com/questions/41902613/what-is-the-c-sharp-equivalent-of-push-and-root-for -mongodb/41903581 # 41903581 Я бы получил полный словарь и фильтр на стороне клиента. Или представляет собой очень большой словарь SocialMedia? –

+0

@MaksimSimkin зависит от 'ServiceType' SocialData максимально до 5 элементов, поэтому он не огромен и ключи уникальны. –

ответ

1

Я не думаю, что MongoDrive мог бы перевести его на запрос. Если SocialMedia не очень Hige я хотел бы получить весь словарь и фильтровать его на стороне клиента:

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

Большое спасибо, так как я сказал, что «SocialData», на мой взгляд, является небольшим словарем, поэтому это решение должно мне подойдет. –

+0

@ TomaszKowalczyk Добро пожаловать, если это вам поможет, я буду благодарен за upvote :) –

 Смежные вопросы

  • Нет связанных вопросов^_^