javascript - MongoDB MapReduce、日期和 % 运算符

标签 javascript python mongodb mapreduce

我有一个 python 脚本女巫的问题,我用它来将大型集合聚合成较小的部分,并让它们按时间戳分组。

map = Code("function(number) {"
    "emit({"
        "ts : new Date(new Date((this.ts - (this.ts % (60 * number))) * 1000).setSeconds(0))"
   "}, 1);"
"}")

reduce = Code("function(key, vals) {"
    "var sum = 0;"
    "for (var i in vals) {"
        "sum += vals[i]"
    "}"
    "return sum;"
"}")

如您所见,这是一个非常简单的 MapReduce,时间戳 (ts) 应该按给定的分钟数分组。我在这里测试了 Javascript http://jsfiddle.net/QgMzK/1/它似乎工作正常。但是当我在 Python 中运行它时,所有时间戳都变成 ISODate("1970-01-01T00:00:00Z")。

有什么想法吗?

最佳答案

你的 map 函数有一个参数:number,当被 map-reduce 调用时,它会被设置为 null 并且在转换之后(和一些 % 为零)将使您的 map 返回 ISODate("0NaN-NaN-NaNTNaN:NaN:NaNZ") 的日期。这在类型转换后变为 datetime.datetime(1970, 1, 1, 0, 0)

删除参数,它应该可以工作。

编辑

要确认这一点,请尝试运行此代码:

from pymongo import Connection
from bson.code import Code

db = Connection().mr_test
for i in xrange(10):
    db.things.insert({"x" : i})


map = Code("function(number) {"
    "emit({"
        "ts : number"
    "}, 1);"
"}")

reduce = Code("function(key, vals) {"
    "var sum = 0;"
    "for (var i in vals) {"
        "sum += vals[i]"
    "}"
    "return sum;"
"}")


result = db.things.map_reduce(map, reduce, "test_results")
for doc in result.find():
    print doc

我机器上的结果是:

{u'_id': {u'ts': None}, u'value': 10.0}

注意结果中的tsNone,因为执行映射函数时没有设置number

编辑2

AFAIK 将参数传递给 map 的唯一方法是在 map_reduce 中使用 scope 可选参数,但是你必须无论如何将其从 map 签名中删除。

因此,将您的 map 更改为:

map = Code("function() {"
    "emit({"
        "ts : new Date(new Date((this.ts - (this.ts % (60 * number))) * 1000).setSeconds(0))"
    "}, 1);"
"}")

并通过调用:

db.whatever.map_reduce(map, reduce, "collection_name", scope = {"number" : the_value_your_function_needs}) 

你可以得到你想要的结果。

关于javascript - MongoDB MapReduce、日期和 % 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11965676/

相关文章:

javascript - 仅在页面验证后刷新页面

mongodb - 为什么 MongoDB 不再允许在空文档中使用 $set 和 $unset?

java - 通过 Spring MongoTemplate 聚合以获得集合的最大值

javascript - Mongo findOne 在数组里面

python - 从命令行运行 R 脚本(从 python 执行)

python - numpy all 不同于 builtin all

javascript - 加密有效,但在 openpgp.js 中无法解密

javascript - 鼠标移开时显示/隐藏菜单

javascript - 采用 HTML 形式并将值传递给 node.js 函数中的变量

python - 使用opencv和python隔离图片中的数字矩阵