为了账号安全,请及时绑定邮箱和手机立即绑定

Aerospike 查询返回最大值

Aerospike 查询返回最大值

Go
largeQ 2022-03-02 13:36:20
我正在尝试为我的 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)有人知道怎么做吗?
查看完整描述

1 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

您可以将 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


查看完整回答
反对 回复 2022-03-02
  • 1 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信