簡體   English   中英

MongoDB MapReduce,Date和%運算符

[英]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}

請注意,結果中tsNone ,執行映射功能時未設置原因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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM