MongoDB C# 查询:过滤器 + 聚合 + 检查值是否为 true/false

MongoDB C# Query: Filter + Aggregation + Checking if value is true/false

我需要执行一个非常复杂的 MongoDB 查询,我很难将整个事情缩小到一个查询,虽然我认为这是可行的,但我真的不认为在 MongoDB 方面有足够的经验,可以非常正确地完成它,非常感谢您的帮助。

我的 class 看起来像这样:

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

    public int Value { get; set; }

    public bool IsDropped { get; set; }
}

我需要能够 select 每个未删除的 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

除此之外,我还需要能够执行简单的过滤器查询,例如 "only return items where ID == 1 || ID == 2"

这可以在单个查询中完成吗?我能够根据最小值聚合 class,但是将 IsDropped 参数添加到组合中让我很难编写一个可以执行所有这些的查询。

在此先感谢您的帮助。

我认为这可以帮助你:

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