MongoDB的push和root的C#等价物是什么?

我有一群人。 我试图为每个名字找到最老的人。 我可以使用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()) ,但是抛出和exception“First()”不受支持。 我相信部分问题是我的Person类型没有ID,因此_id被放在实际的mongo文档上(插入时由mongo自动)。 当它试图返回类型时,它无法进行直接映射。

因此,考虑到查询的两个版本,如何在不必拼出每个字段的情况下将我的完整类型返回到C#中?

这是MongoDB驱动程序的一个function。 它不接受简单的First(),它需要它背后的东西。 这就是我通过调试看到的。 所以你应该继续使用First()……或者你可以直接查询你的json:

 var result = collection.Aggregate() .Group(new JsonProjectionDefinition(@" { '_id': '$Name', 'docs': { '$push': '$$ROOT' },}")) .Project(new JsonProjectionDefinition(@"{ 'top_one': { '$slice': ['$docs', 1] } }")) .ToList(); 

马克西姆给我带来了很多方式。 这就是我最终得到的结果,以便获得与我输入相同的类型:

 collection.Aggregate(aggArgs) .SortByDescending(x => x.Age) .Group(new JsonProjectionDefinition(@"{ '_id': '$Name', 'docs': { '$push': '$$ROOT'} }")) .Project(new JsonProjectionDefinition(@"{ 'top': { '$slice': ['$docs', 1] } }")) .Unwind(new StringFieldDefinition("top")) .ReplaceRoot(new BsonValueAggregateExpressionDefinition(@"$top")) .Project(new JsonProjectionDefinition(@"{ _id: 0 }")) .ToList();