如何从 IMongoCollection 的嵌套 KeyValuePair 中获取值
How to get value from nested KeyValuePair from IMongoCollection
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()
的异常,那么我应该如何检索这些数据?
我不认为,MongoDrive 可以将其转换为查询。如果 SocialMedia 不是很高我会得到整个字典并在客户端过滤它:
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
});
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()
的异常,那么我应该如何检索这些数据?
我不认为,MongoDrive 可以将其转换为查询。如果 SocialMedia 不是很高我会得到整个字典并在客户端过滤它:
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
});