我正在寻找一种方法来查询mongo,以便在与变量进行比较时匹配两个字段之间的结果。
例如,重叠日期范围。我有一个包含以下架构的文档:
{startDate : someDate, endDate : otherDate, restrictions : {daysBefore : 5, daysAfter : 5}}
我的用户将提供自己的日期范围,例如
var userInfo = { from : Date, to : Date}
我需要满足这个条件的文件:
startDate - restrictions.daysBefore <= userInfo.to && endDate + restrictions.daysAfter >= userInfo.from;
我尝试使用$where
子句,但是我放弃了to
和from
的上下文,因为它们是在where函数的范围之外定义的。
我想在不删除所有结果的情况下执行此操作,或在插入时创建另一个字段。
是否可以通过简单的方式完成此查询?
答案 0 :(得分:2)
聚合框架[AF]会做你想要的。 AF后端是用C ++编写的,因此使用JavaScript作为额外的好处要快得多。除了更快的JavaScript之外,还有很多原因我们不鼓励使用$,其中一些可以在$ where docs中找到。 AF文档(即使用的好东西): http://docs.mongodb.org/manual/reference/aggregation/ 我不确定您存储的数据的格式,这也会对性能产生影响。例如,如果日期是自1970年1月1日以来的标准日期毫秒(unix epoch)和daysBefore存储在(每天的毫秒数)*(天数),您可以使用简单的数学,如下例所示。这非常快。如果不是AF中有可用的日期转换,但除了获得差异之外,进行转换当然更加昂贵。
在Python中(您的个人资料提到Django)datetime.timedelta可用于daysBefore。例如5天: 导入日期时间 剩余天数= datetime.timedelta(5)
有两种主要方法可以解决您想要在AF中使用的内容。直接进行计算并匹配,或创建一个新列并与之匹配。对于复杂或大规模部署,您的特定用例和测试将是必需的。 shell中的一个聚合命令,用于匹配Python中的计算:
fromDate=<program provided>
db.collection.aggregate([{"$match":{"startDate":{ "$lt": {"$add": ["$restrictions.daysBefore", fromDate]}}}}])
如果您想在同一$ match中运行多个计算,请使用$和:[{},{},...,{}]。为清楚起见,我省略了 有关AF的更多聚合文档可在以下位置找到: http://api.mongodb.org/python/current/examples/aggregation.html#aggregation-framework
请注意,“聚合”还包括Mongo中的map reduce,但是这种情况下AF应该能够完成所有操作(并且更快)。
如果您需要有关AF的任何进一步信息,或者如果有任何文档没有说明,请不要犹豫。
最佳, 查理