Aerospike查询返回最高价值

时间:2016-08-23 12:09:02

标签: go 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)

任何人都知道怎么做?

1 个答案:

答案 0 :(得分: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