4

我已经构建了一些程序来收集大量信息并将其以原始形式存储在 Mongo 数据库中。稍后,在预先指定的时间段,map_reduce调用操作来评估此信息的子集。

原始数据必须保留,不能丢弃,但map_reduce操作不一定需要原始数据的全部结果才能进行操作。相反,我已经构建了这些map_reduce操作,以便它们可以仅在尚未评估的最新收集数据上运行。稍后调用第二个map_reduce操作来处​​理精炼原始数据的缩减。

然后,我需要指定一个查询过滤器,以便已经减少一次的原始数据不会在每个map_reduce操作中减少 a。我遇到的解决方案是指定一个过滤器(或将map_reduce操作传递给查询),它只会选择date_collected字段比预定日期更新的条目。

首先,我尝试使用以下代码:

for k in SomeData.objects.filter(date_collected__gt=BULK_REQUEST_DATE).map_reduce(map_f, reduce_f, {'merge':'COLLECTION'}):
    print k.value

我还用小于过滤器尝试了这个(只是为了确保我没有考虑倒退日期)。它也没有工作。

现在有趣的是。如果我要删除 map_reduce 链式方法调用,并k从上面打印,如下所示:

for k in SomeData.objects.filter(date_collected__gt=BULK_REQUEST_DATE):
    print k

过滤器工作得非常好,并且只选择在特定时间点之后收集的数据。

接下来,我破解了 MongoEnginequeryset.py模块,并在方法中添加了一个可选参数,以便map_reduce可以将查询传递给map_reduce函数,如下所示:

q = {'date_collected' : {'$lte' : BULK_REQUEST_DATE}}

for k in SomeData.objects.filter(date_collected__lte=BULK_REQUEST_DATE).map_reduce(map_f, reduce_f, {'merge':'COLLECTION'}, query=q):
        print k.value

同样,这未能产生预期的结果。但是没有错误。我能够通过传递配置不正确的查询或将高级查询运算符更改为类似的东西来中断操作,所以知道我通过该方法的任何查询都在被评估,并且至少不会引起任何问题.map_reduce$lte$asdfjlamap_reduce

在执行操作的所有上述方法中map_reduce,对原始存储中的所有数据进行了评估。我的尝试都没有破坏 map_reduce 操作,但它们也未能将查询限制为数据的子集。

有人可以指出我比较日期的逻辑中的缺陷吗?

日期作为 python datetime.time 存储在 mongo 数据库中。在比较两个日期之前,我还尝试将日期更改为 ISOformat。这在 python 或 javascript 端不起作用。

任何帮助将不胜感激!谢谢你。

更新

我已经确定问题不在于 MongoEngine。

问题与在 javascript 中使用“$gte”或“$lte”等运算符比较 PyMongo Datetime 对象的方式有关。由于某种原因,日期时间对象没有被这样对待,或者没有正确转换为 javascripts 日期。

我还没有弄清楚更多,但是如果您有任何指示,我肯定会使用它们!

更新

我已经从测试 MongoEngine 转向直接测试 PyMongo。以下代码无法产生预期的结果。注意:epochtime 是一个字段,包含自创建文档的纪元以来的秒数(以 int 形式)。Timestamp 也是一个 int,在运行时创建。

j = db.data.map_reduce(map_f, reduce_f, {'merge':'COLLECTION'}, query={'epochtime':{'$lte':timestamp}})
for x in j.find():
    print x

我希望当使用“$ lte”时,for循环会打印x,因为时间戳> epochtime总是。或者,我希望如果使用“$gte”,则不会打印任何值。相反,相同的值被打印在两个事件中;使用“$lte”或“$gte”运算符时没有区别。

我错过了什么?

更新

我应用了与我之前的更新相同的操作,期望它而不是自纪元以来的秒数,我将集合中的每个纪元时间字段重置为从 1 开始的递增数字。我还设置了时间戳 = 1。然后我执行map_reduce 操作。它工作正常。

这让我觉得字段的字节大小有问题?我使用浮点字段复制了上述结果。它适用于小浮点数,但不适用于表示自纪元以来的秒数(带小数)的浮点数。

我肯定在这里错过了一些基本的东西......

更新

发现了可能导致问题的东西。当我使用map_reduce的合并输出功能时,它成功地根据查询进行过滤,然后第一时间将减少的数据保存到指定的集合中。但是,这只适用于一次。后记,查询中的条件无法始终如一地工作,如果有的话。这似乎只发生在合并输出功能上。使用替换、减少或内联输出方法时不会发生这种情况。此外,似乎当在同一集合上第二次使用合并函数时,查询参数中的条件取决于被比较的两个值的大小 - 请参阅先前的更新。

我不知道这意味着什么,也不知道为什么会这样。

4

0 回答 0