我有一群人。我正在尝试为每个名字找到年龄最大的人。我可以使用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 console命令,但我真的不喜欢构造匿名对象。我更愿意这样做Group(x => x.Name,x => x.First())
,但是会抛出和不支持“ First()”的异常。我相信部分问题是我的Person类型没有ID,因此_id放在实际的mongo文档中(插入时由mongo自动执行)。当它尝试返回到类型时,它无法进行直接映射。
因此,考虑到两个版本的查询,如何在不用拼写每个字段的情况下将我的完整类型恢复为C#?
这是MongoDB驱动程序的功能。它不接受简单的First(),它后面需要一些东西。那是我通过调试看到的。因此,您应该继续使用First()...或直接查询json:
var result = collection.Aggregate()
.Group(new JsonProjectionDefinition<People>(@" {
'_id': '$Name',
'docs': { '$push': '$$ROOT' },}"))
.Project<TopOne>(new JsonProjectionDefinition<BsonDocument>(@"{
'top_one': {
'$slice': ['$docs', 1]
} }"))
.ToList();
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句