我有一个类,它包含两个DateTime变量," From"和" To":
public class A
{
public DateTime From;
public DateTime To;
}
如果我想要获取所有物品,其中From和Two相隔仅2小时,我会写下这样的东西:
_db.GetCollection<A>("A").Find( (x.To-x.From).TotalMinutes <= 120).ToList();
或
var Minutes120 = new TimeSpan(2, 0, 0);
_db.GetCollection<A>("A").Find( (x.To-x.From) <= Minutes120).ToList();
甚至
var Minutes120 = new TimeSpan(0, 120, 0).Ticks;
_db.GetCollection<A>("A").Find( (x.To.Ticks-x.From.Ticks) <= Minutes120).ToList();
但是,上述工作都没有。我总是得到&#34; ...不受支持。&#34; 错误。
有没有办法像上面那样进行搜索,而不必将时间差与日期保存在一个单独的属性中?保存时差似乎有点过分,尽管我只需要在一个查询中使用它。
答案 0 :(得分:2)
在query reference of mongo db中没有算术运算符。这意味着使用此类运算符的查询无法转换为MongoDB查询。
因此,添加成员的替代方案是
1)展开查询并将表达式放在ToList()之后的Where子句中(所有差异的内存中.NET计算比较)
2)使用MongoDB引擎的aggregation methods这是一种可能的查询方式:聚合From和To字段,可能使用$sum
或其他内容,以$match
结尾根据您的120分钟要求获得结果。请记住,聚合的输出是not really a class of yours anymore(因为您已经引入了新成员)。 Here是一篇关于使用聚合函数进行搜索和计算的精彩文章。