c# - MongoDB 的推送和根在 C# 中的等效项是什么?

标签 c# .net mongodb mongodb-query mongodb-.net-driver

我有一群人。我正在尝试为每个名字找到最年长的人。我能够使用 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# 中恢复我的完整类型而不必拼出每个字段?

最佳答案

这是 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();

关于c# - MongoDB 的推送和根在 C# 中的等效项是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41902613/

相关文章:

c# - 使用 C# 将大 (4gb) avi 文件转换为 mpeg 或 mp4 格式

c# - 如何在 C# 中生成 key 和 key IV aes

node.js - 如何使用云功能正确连接到 MongoDB?

node.js - 如何在 Nestjs 中创建 mongodb 连接提供程序

c# - 如何使用方法参数属性

c# - 我怎么知道什么时候需要处置一个对象?

.net - NAnt 最佳实践

c# - 如何知道我的对象在 C# 中有多少字节?

C# .NET Core 如何在 System.Private.CoreLib.dll 中调试 System.IO.FileNotFoundException?

javascript - 更新 Mongoose 模型内的数组