簡體   English   中英

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

[英]What is the C# equivalent of push and root for MongoDB?

我有一群人。 我試圖為每個名字找到最老的人。 我可以使用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();

馬克西姆給我帶來了很多方式。 以下是我最終得到的相同類型,因為我投入了:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM