我有一个类,它包含两个DateTime变量,"From“和"To":
public class A
{
public DateTime From;
public DateTime To;
}如果我想得到所有的对象,其中距离只有两个小时,我会写这样的东西:
_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();然而,上述任何一项工作都没有。我总是得到"...is不支持。“错误。
是否有任何方法可以进行上述搜索,而不必将时间差与日期一起保存在单独的属性中?虽然我只在一个查询中需要时差,但节省时间差似乎有点过分。
发布于 2016-05-04 12:01:01
在mongo db的查询引用中没有算术运算符。这意味着使用这些运算符的查询不能转换为MongoDB查询。
因此,添加成员的替代方法是,
1)展开查询,并将表达式放在ToList()之后的Where子句中(内存中.NET计算所有差异的比较)
2)使用聚合方法的MongoDB引擎(这是一种可能的查询方式):在From和字段上进行聚合,可能是使用$sum之类的,最后以$match结束,以120分钟的要求结束。请记住,聚合的输出是不再是你的阶级了 (正如您引入了一个新成员一样)。这里是一篇关于使用聚合函数进行搜索和计算的优秀文章。
https://stackoverflow.com/questions/37026297
复制相似问题