2016-04-04 8 views
0

集計関数を使用してデータを表示/一覧表示しようとしていますが、それは起こっていません。C#のMongoDB集計関数

このコードは絶対に問題ありません。私はこの

  var myresults = await col.Aggregate() 
      .Unwind("{$scores}") 
      .Group(new BsonDocument { { "_id", "$_id" }, { "lowscore", new BsonDocument("$min", "$scores.score") } }) 
      //.Group("{_id:'$_id',lowscore:{$min:'$scores.score'}}") 
      .ToListAsync(); 

var myresults = await col.Find(filter2) 
      .Limit(2) 
      .Project("{name:1,scores:1,_id:0}") 
      .Sort("{score:1}") 
      .ToListAsync(); 

を交換するとき、それはしかし、レコードが引かされていない必要がありますよう

 var connectionstring = "mongodb://localhost:27017"; 
     var client = new MongoClient(connectionstring); 
     var db = client.GetDatabase("school"); 
     var col = db.GetCollection<BsonDocument>("students"); 
     var filter = new BsonDocument("type", "homework"); 
     var filter2 = Builders<BsonDocument>.Filter.Eq("scores.type", "homework"); 

     var myresults = await col.Find(filter2) 
      .Limit(2) 
      .Project("{name:1,scores:1,_id:0}") 
      .Sort("{score:1}") 
      .ToListAsync(); 

     foreach (var result in myresults) 
     { 
      Console.WriteLine(result); 
     } 

このコードでは、ドキュメントをフェッチします。 パイプラインメソッドを使用したくありません。私は単に集計関数で得られた結果を表示したいと思います。

この私のMongoのクエリ(私はC#でこれと同じ結果をしたい)される -

db.students.aggregate([{$sort:{_id:-1}},{$unwind:"$scores"},{$group:{_id:"$_id", lowscore:{"$min":"$scores.score"}}}]) 

答えて

2

これは間違っています... {$scores}はjsonでも有効ではありません。中括弧とドル記号を$unwindディレクティブから削除します。

パラメータ名はフィールドなので、フィールド名を入力する必要があります。

+0

ありがとう!私はそれを見落とした! –

0

はたったの$ @のscores.scoreの代わりにスコアを書いてみてください。それは役に立つかもしれません。

db.students.aggregate([{$sort:{_id:-1}},{$unwind:"$scores"},{$group:{_id:"$_id", lowscore:{"$min":"$score"}}}]) 
+0

mongoクエリが正常に動作します。私はC#ドライバで助けが必要です:) –

0

ビルディングアグリゲーションパイプラインは少しトリッキーです。

試してみてください。

var pipeline = new BsonDocument[] { 
    new BsonDocument{ { "$sort", new BsonDocument("_id", 1) }}, 
    new BsonDocument{{"$unwind", "$scores"}}, 
    new BsonDocument{{"$group", new BsonDocument{ 
       {"_id", "$_id"}, 
       {"lowscore",new BsonDocument{ 
         {"$min","$scores.score"}} 
       }} 
     }} 
}; 

var result = collection.Aggregate<BsonDocument> (pipeline).ToListAsync(); 

あなたがpipeline.ToJson()を行う場合は、あなたがあなたの元とテストMongoShellクエリのと同じであるJSON文字列と同等以下取得します。

[ 
    { 
     "$sort": { 
      "_id": 1 
     } 
    }, 
    { 
     "$unwind": "$scores" 
    }, 
    { 
     "$group": { 
      "_id": "$_id", 
      "lowscore": { 
       "$min": "$scores.score" 
      } 
     } 
    } 
]