2016-12-18 5 views
1

Мне нужно выполнить довольно сложный запрос MongoDB, и мне очень сложно сузить всю вещь до одного запроса, хотя я думаю, что это выполнимо. На самом деле у меня нет достаточного опыта работы с MongoDB, чтобы получить его совершенно правильно, и я очень благодарен за помощь.MongoDB C# Query: Filter + Aggregation + Проверка значения true/false

Мой класс выглядит примерно так:

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: 1, Value: 150, IsDropped: false 
ID: 2, Value: 100, IsDropped: false 

Однако, если все значения для определенного ID отбрасываются, я хочу, чтобы иметь возможность знать, что хорошо так, например, для этих значений:

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

Я хочу получить:

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

Также на вершине, что мне нужно, чтобы быть в состоянии выполнять простые запросы фильтра, например «только возвращают элементы where ID == 1 || ID == 2»

Можно ли это сделать в одном запросе? Я могу агрегировать класс на основе минимального значения, но добавление параметра IsDropped в микс делает для меня очень трудным написать один запрос, который может выполнить все это.

Заранее благодарим за помощь.

+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

Эй, в первую очередь, спасибо. Кажется, это работает так, как предполагалось, и выглядит великолепно. Возможно ли вернуть результаты в качестве класса «MyItem» вместо BsonDocument? Или мне нужно десериализовать BsonDocument после выполнения запроса? –

+0

Результаты находятся в новом типе, поэтому вы не можете получить их как 'MyItem', но вы можете определить новый класс так же, как свойства результатов;). –

+0

Получил, спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^