我需要执行一个非常复杂的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
参数使我很难编写一个可以执行所有这些操作的查询。
提前感谢您的帮助。
答案 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();