我有一个类,它包含两个DateTime变量"From"one_answers"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();
然而,以上这些都不起作用。我总是得到"…不受支持。"错误。
有没有什么方法可以像上面那样进行搜索,而不必将时差和日期一起保存在单独的房产中?虽然我只在一个查询中需要它,但节省时差似乎有点过头了。
在mongodb的查询引用中没有算术运算符。这意味着使用此类运算符的查询无法转换为MongoDB查询。
因此,添加成员的替代方案是,
1) 展开查询,并将表达式放在ToList()之后的Where子句中(内存中.NET计算所有差异的比较)
2) 使用MongoDB引擎的聚合方法,这是一种可能的查询方式:在From和to字段上进行聚合,可能使用$sum
或其他方法,在120分钟的要求下,在结果上以$match
结束。请记住,聚合的输出实际上不再是您的类(因为您引入了一个新成员)。这是一篇关于使用聚合函数进行搜索和计算的好文章。