![](/img/trans.png)
[英]What is equivalent of DocumentClientException.RetryAfter in MongoDB C# driver?
[英]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.