2016-08-23 113 views
1

我正在嘗試爲我的Aerospike數據庫創建一個查詢,這將返回特定bin中的最高值;類似MAX()函數在MySQL中的工作方式。例如,如果我有這樣的一套:Aerospike查詢返回最高值

+--------------+---------+ 
| filename  | version | 
+--------------+---------+ 
| alphabet.doc | 4  | 
| people.doc | 2  | 
| alphabet.doc | 6  | 
| people.doc | 3  | 
+--------------+---------+ 

我需要的是隻返回文件名與最高版本號。目前我可以添加一個像這樣的過濾器:

stmt := db.NewStatement(DBns, DBset, "filename", "version") 
    stmt.Addfilter(db.NewEqualFilter("filename", "alphabet.doc")) 

    // run database query 
    records := runQuery(stmt) 

任何人都知道如何做到這一點?

+0

我不知道Aerospike,但快速查看文檔指出了UDF(用戶定義函數)。 http://www.aerospike.com/docs/client/go/usage/query/query_udf.html – jnmoal

回答

4

您可以將Lua用戶定義的函數(UDF)應用於查詢以高效過濾結果。

E.g.這裏是一個Stream UDF,它將返回記錄的最大值。版本號:

function maxVersion(stream, bin) 
    -- The stream function cannot return record objects directly, 
    -- so we have to map to a Map data type first. 
    local function toArray(rec) 
    local result = map() 
    result['filename'] = rec['filename'] 
    result['version'] = rec['version'] 
    return result 
    end 
    local function findMax(a, b) 
    if a.version > b.version then 
     return a 
    else 
     return b 
    end 
    end 
    return stream : map(toArray) : reduce(findMax) 
end 

使用Go客戶端,你將執行這樣的功能:

stmt := NewStatement(ns, set) 
    recordset, _ := client.QueryAggregate(nil, stmt, "udfFilter", "maxVersion") 

    for rec := range recordset.Results() { 
    res := rec.Record.Bins["SUCCESS"].(map[interface{}]interface{}) 
    fmt.Printf("filename with max. version: %s (ver. %d)\n", res["filename"], res["version"]) 
} 

我上傳了一個有效的例子作爲要點在這裏:https://gist.github.com/jhecking/b98783bea7564d610ea291b5ac47808c

你可以找到有關如何使用Stream UDF進行查詢聚合的更多信息,請執行以下操作:http://www.aerospike.com/docs/guide/aggregation.html

+1

非常感謝您的回答。我很害怕我不得不面對UDF,但是想要確保沒有預先設定好的功能。我還沒有和航空航天走得那麼遠,我的盧阿經驗幾乎爲零,所以這將是一個巨大的幫助:) – Cory