gpt4 book ai didi

go - Aerospike 查询返回最高值

转载 作者:IT王子 更新时间:2023-10-29 01:54:49 26 4
gpt4 key购买 nike

我正在尝试为我的 Aerospike 数据库创建一个查询,它将返回特定 bin 中的最高值;类似于 MAX() 函数在 MySQL 中的工作方式。例如,如果我有这样一个集合:

+--------------+---------+
| 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)

有人知道怎么做吗?

最佳答案

您可以将 Lua 用户定义函数 (UDF) 应用于查询以有效地过滤结果。

例如这是一个 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

您可以在此处找到有关如何使用流 UDF 进行查询聚合的更多信息:http://www.aerospike.com/docs/guide/aggregation.html

关于go - Aerospike 查询返回最高值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39100766/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com