2016-12-18 14 views
1

かなり複雑なMongoDBクエリを実行する必要がありますが、全体を1つのクエリに絞り込むことは難しいです。私はMongoDBに十分な経験があるわけではありません。私は本当にそれを得るには十分な経験がありません。本当に助けていただければ幸いです。私はドロップされません各ID分間値を選択できるようにする必要がありMongoDB C#クエリ:フィルタ+集計+値が真/偽であるかどうかの確認

class MyItem 
{ 
    public int ID { get; set; } 

    public int Value { get; set; } 

    public bool IsDropped { get; set; } 
} 

私のクラスには、次のようになります。たとえば、次のようにこれらの項目の

items.Add(new MyItem() { ID = 1, Value = 100, IsDropped = true }); 
items.Add(new MyItem() { ID = 1, Value = 150, IsDropped = false }); 
items.Add(new MyItem() { ID = 1, Value = 200, IsDropped = true }); 
items.Add(new MyItem() { ID = 2, Value = 100, IsDropped = false }); 
items.Add(new MyItem() { ID = 2, Value = 250, IsDropped = false }); 

は、私が返さたい値は次のとおりです。特定のIDのすべての値が削除されている場合

ID: 1, Value: 150, IsDropped: false 
ID: 2, Value: 100, IsDropped: false 

はしかし、私もそれを知ることができるようにしたいですそうこれらの値の例:

ID: 2, Value: (doesn't really matter), IsDropped: true 

items.Add(new MyItem() { ID = 2, Value = 100, IsDropped = true }); 
items.Add(new MyItem() { ID = 2, Value = 150, IsDropped = true }); 

私が取得したいです0

また、単純なフィルタクエリを実行できるようにする必要があります。たとえば、「返品のみwhere ID == 1 || ID == 2

これは単一のクエリで実行できますか?最小値に基づいてクラスを集計することができますが、IsDroppedパラメータを追加すると、このすべてを実行できる1つのクエリを作成するのが難しくなります。

ご協力いただきありがとうございます。

+0

は、あなたが 'コレクション内のルート文書をMyItem'ですか?重複する「ID」を有することは不可能である。 –

答えて

1

私は、これはあなたを助けることができると思う:この使用

var groupBy = new BsonDocument 
{ 
    {"_id", "$ID"}, 
    { 
     "min", new BsonDocument("$min", new BsonDocument 
     { 
      {"IsDropped", "$IsDropped"}, //This line will do the trick ;) 
      {"Value", "$Value"} 
     }) 
    } 
}; 
var results = collection.Aggregate().Group(groupBy).ToList(); 

をグループ化した結果の上にフィルタを追加する:

// `where ID == 1 || ID == 2` is as same as `where ID IN (1,2)` 
var having = Builders<BsonDocument>.Filter.In("_id", new[] { 1, 2 }); 

// Now put having after groupBy 
var results = collection.Aggregate().Group(groupBy).Match(having).ToList(); 
+0

ねえ、まずはおかげさまで。これは意図したとおりに動作しているように見えますBsonDocumentの代わりに "MyItem"クラスとして結果を戻すことは可能ですか?または、クエリを実行した後でBsonDocumentを逆シリアル化する必要がありますか? –

+0

結果は新しいタイプなので、それらを 'MyItem'として取得することはできませんが、結果クラスと同じ新しいクラスを定義することができます;)。 –

+0

ありがとう! –

関連する問題