【发布时间】:2015-12-07 02:28:45
【问题描述】:
我收集了来自不同来源、不同频率的测量结果。
对于任何给定的来源子集,我如何获得截至特定日期的最新良好价值? (这类似于pandas.Index.asof)?
需要明确的是,对于其中一些时间序列可能没有所需日期的可用值,因此我必须在可用日期中找到低于查询日期的最新日期。
时间序列可能如下所示:
{_id:new ObjectId(), source:"1stDayofMonth", date:new ISODate(<day1>) value:somevalue}
{_id:new ObjectId(), source:"Monday", date:new ISODate(<day1>) value:somevalue}
{_id:new ObjectId(), source:"daily", date:new ISODate(<day1>) value:somevalue}
/...
{_id:new ObjectId(), source:"daily", date:new ISODate(<dayN>) value:somevalue}
{_id:new ObjectId(), source:"Wednesday", date:new ISODate(<dayN>) value:somevalue}
// and so on...
给定正确的索引 (db.myCollection.createIndex({date:1, source:1})),对于sources 的任何子集,我如何才能获得给定queryDate 的最新良好value?
这是我得到的结果,但这个解决方案未能返回每个 source 的 1 个 value(如果您阅读代码,您会发现仅查询一个 source 时这会起作用,但是当查询不同的,它返回超过 1 个高频源值):
querySources = ['1stDayofMonth','Monday'] # as an example, let's say I want only these 2 sources
nSources = np.size(querySources)
cursor = db.myCollection.find( {'source':{ '$in': querySources}, 'date':{ '$lt': queryDate}}).sort(date:-1).limit(nSources)
有什么想法吗?
编辑:我应该提到文档指出this solution,但aggregate 可能非常慢并且集合足够大以至于查询时间变长(例如查询 1000 个源,每个源有 10000 天的数据)
【问题讨论】: