2017-01-27 2 views
3

私は人々の集まりを持っています。私はそれぞれの名前のために一番古い人物を見つけようとしています。私はC#のドライバーのためのこれの同等とは何であるMongoDBのpushとrootに相当するC#は何ですか?

db.People.aggregate([ 
    { '$sort': { 'Name': 1, 'Age': -1 } }, 
    {  
     '$group': { 
      '_id': '$Name', 
      'docs': { '$push': '$$ROOT' }, 
     } 
    }, 
    { 
     '$project': { 
      'top_one': { 
       '$slice': ['$docs', 1] 
      } 
     } 
    } ]) 

MongoDBのコンソールコマンドを使用して、その結果を達成することができていますか?私は、特にここで

'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()"はサポートされていないという例外と例外がある。問題の一部は私の人型にIDがないので、_idは実際のmongoドキュメントに置かれます(挿入時に自動的にmongoによって)。型に戻ろうとすると、直接マッピングはできません。

したがって、2つのバージョンのクエリを念頭に置いて、完全な型をC#ですべてのフィールドを綴ることなく戻すにはどうすればよいですか?

答えて

3

MongoDBドライバの機能です。それは単純なファースト()を受け入れません、それはその背後に何かが必要です。それは私がデバッグで見たものでした。だから、最初に()で動作し続けるべきいずれか...またはあなたが直接あなたの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(); 
1

。私が入れていたのと同じタイプを出すために私が終わったのは以下の通りです:

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(); 
+0

いい仕事です!私にとってはちょっと馬鹿げた方法ですが、私はmongoドライバを使って、linqを使って休憩をとることができますが、それはあなたの選択です。あなたのデータがどれだけ大きいか分かりません。 –

関連する問題