【发布时间】:2017-06-13 15:28:54
【问题描述】:
我有一群人。我正在尝试为每个名字找到最年长的人。我可以使用 mongoDB 控制台命令实现该结果
db.People.aggregate([
{ '$sort': { 'Name': 1, 'Age': -1 } },
{
'$group': {
'_id': '$Name',
'docs': { '$push': '$$ROOT' },
}
},
{
'$project': {
'top_one': {
'$slice': ['$docs', 1]
}
}
} ])
对于 C# 驱动程序来说,这相当于什么?我特别有问题
'docs': { '$push': '$$ROOT' },
这是我当前的 C# 查询:
collection.Aggregate(aggArgs)
.SortByDescending(x => x.Age)
.Group(x => x.Name, x => new {
Name = x.First().Name,
FavoriteColor = x.First().FavoriteColor,
FavoriteFood = x.First().FavoriteFood
}).ToListAsync().Result;
它的工作方式与我的 mongo 控制台命令的作用很接近,但我真的不喜欢构造匿名对象。我宁愿做Group(x => x.Name,x => x.First()),但是不支持“First()”的抛出和异常。我相信部分问题是我的 Person 类型没有 ID,所以 _id 被放在实际的 mongo 文档上(由 mongo 在插入时自动)。当它尝试返回类型时,它无法进行直接映射。
那么,考虑到查询的两个版本,我如何在 C# 中恢复我的完整类型,而不必拼出每个字段?
【问题讨论】:
标签: c# .net mongodb mongodb-query mongodb-.net-driver