MongoDB C#查询:过滤+聚合+检查值是否为真/假

时间:2016-12-18 09:52:12

标签: c# mongodb aggregation-framework mongodb-.net-driver

我需要执行一个非常复杂的MongoDB查询,我很难将整个事情缩小到一个查询,虽然我认为这是可行的我没有足够的经验使用MongoDB来做得很对,我真的很感激一些帮助。

我的班级看起来像这样:

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

    public int Value { get; set; }

    public bool IsDropped { get; set; }
}

我需要能够为每个未删除的ID选择最小值。例如:

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参数使我很难编写一个可以执行所有这些操作的查询。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分: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();