【问题标题】:How to get value from nested KeyValuePair from IMongoCollection如何从 IMongoCollection 的嵌套 KeyValuePair 中获取值
【发布时间】:2017-01-30 13:00:59
【问题描述】:

MongoDB中的行结构如下:

{
"_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() 的异常,那么我应该如何检索这些数据?

【问题讨论】:

  • This 问题可能会有所帮助。
  • 我不认为这是可能的,这已经是一个类似的问题了:stackoverflow.com/questions/41902613/… 我会在客户端获得整个字典和过滤器。或者社交媒体真的是一本巨大的字典吗?
  • @MaksimSimkin 依赖于ServiceType SocialData 最多可包含 5 个元素,因此它不是很大并且键是唯一的。

标签: c# .net mongodb linq mongodb-.net-driver


【解决方案1】:

我不认为,MongoDrive 可以将其转换为查询。如果社交媒体不是很高,我会得到整个字典并在客户端过滤它:

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

【讨论】:

  • 非常感谢,正如我所说,SocialData 在我看来是一个小字典,所以这个解决方案应该很适合我。
  • @TomaszKowalczyk 欢迎您,如果它对您有帮助,我将不胜感激:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多