我有数据库结构,接近于此:
+--------------+---------+------------------------------+
| hostname | cont | numbers |
+--------------+---------+------------------------------+
| host01 |{"k":"v"}|LIST(`[["1", "123456", ...]]`)|
| host02 |{"k":"v"}|LIST(`[["1", "654321", ...]]`)|
+--------------+---------+------------------------------+
我想通过过滤垃圾箱“数字”和“主机名”来获得某些记录。它应该包含一个具有特定数字的字符串,这是我从其他组件获得的。在上面的代码中,它是“123456”
基本上,我以前都是这样搜索的,直到需要二维数组:
stmt := aerospike.NewStatement(namespaceName, setName)
stmt.SetPredExp(
aerospike.NewPredExpStringBin("hostname"),
aerospike.NewPredExpStringValue(inputHostName),
aerospike.NewPredExpStringRegex(0),
aerospike.NewPredExpStringBin("deleted"),
aerospike.NewPredExpStringValue("true"),
aerospike.NewPredExpStringEqual(),
aerospike.NewPredExpNot(),
aerospike.NewPredExpAnd(2))
)
我一直在寻找通过数组过滤的可能方法,但没有得到任何解决方案。
我在网上找到的方式是这样的:
stmt := aerospike.NewStatement("test", "settest")
qPolicy := aerospike.NewQueryPolicy()
qPolicy.PredExp = append(qPolicy.PredExp,
aerospike.NewPredExpStringVar("v"),
aerospike.NewPredExpStringValue(id),
aerospike.NewPredExpStringEqual(),
aerospike.NewPredExpListBin("numbers"),
aerospike.NewPredExpListIterateOr("v"))
recordSet, err := aerospikeClient.client.Query(qPolicy, stmt)
但它不起作用。
如果我使用主机名和某种方式解析数组来提供谓词表达式,是否可以搜索记录?
更新:
我发现,这种情况可以通过使用过滤器表达式来解决,尤其是使用 CDTContext。但是 Aerospike 文档中关于此工具的使用信息非常少,尤其是关于 Go 代码的信息。我只找到了这种方法,它可以提供帮助,但我不明白如何在我的情况下正确使用它:
func aerospike.ExpListGetByValue(returnType aerospike.ListReturnType, value *aerospike.Expression, bin *aerospike.Expression, ctx ...*aerospike.CDTContext) *aerospike.Expression
UPD2 通过使用 ExpListGetByValue 我试图进行查询,但它找不到任何东西。它看起来像这样:
stmt := aerospike.NewStatement(namespaceName, setName)
qPolicy := aerospike.NewQueryPolicy()
qPolicy.FilterExpression = aerospike.ExpEq(
aerospike.ExpListGetByValue(
这recordSet是空的,虽然“数字”箱确实包含这个numVal
隔江千里
相关分类