Aerospike 查询返回最大值

我正在尝试为我的 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)

有人知道怎么做吗?


largeQ
浏览 154回答 1
1回答

MYYA

您可以将 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"])}我在这里上传了一个完整的工作示例作为 Gist:https ://gist.github.com/jhecking/b98783bea7564d610ea291b5ac47808c您可以在此处找到有关如何使用流 UDF 进行查询聚合的更多信息:http ://www.aerospike.com/docs/guide/aggregation.html
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go