基于字段计算的mongo查询

时间:2013-09-12 19:21:33

标签: mongodb

我正在寻找一种方法来查询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子句,但是我放弃了tofrom的上下文,因为它们是在where函数的范围之外定义的。

我想在不删除所有结果的情况下执行此操作,或在插入时创建另一个字段。

是否可以通过简单的方式完成此查询?

1 个答案:

答案 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的任何进一步信息,或者如果有任何文档没有说明,请不要犹豫。

最佳, 查理