[英]MongoDB MapReduce, Date and % operator
我有一個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,而在coertion之后(和一些%
為零)將使你的地圖返回的日期為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}
請注意,結果中ts
為None
,執行映射功能時未設置原因number
。
編輯2
AFAIK將參數傳遞給map
的唯一方法是使用map_reduce
scope
可選參數,但是無論如何你都必須將其從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})
你可以得到你想要的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.