在Aerospike中,我需要基于mapkeys值运行查询,并按具有2个值的记录进行过滤
我的按一个值进行过滤的谓词看起来像这样,并且有效
predexp.stringValue('t3'),
predexp.stringVar('item'),
predexp.stringEqual(),
predexp.mapBin('category'),
predexp.mapKeyIterateAnd('item')
我尝试使用“ and()”方法复制代码,但所有尝试均返回错误代码4
请帮忙吗?
答案 0 :(得分:1)
我不确定我是否完全理解您的问题。我认为,您想找到所有具有映射箱categories
的记录,该映射箱至少具有两个键t3
和其他特定值。是吗?
这是您要执行的操作:
const as = require('aerospike')
as.connect().then(async client => {
await client.put(new as.Key('test', 'qq', 1), { categories: { red: 1, blue: 2, green: 3 } })
await client.put(new as.Key('test', 'qq', 2), { categories: { blue: 2, green: 3, yellow: 4 } })
const query = client.query('test', 'qq')
query.predexp = [
// Find any record that has a category blue.
as.predexp.stringValue('blue'),
as.predexp.stringVar('cat'),
as.predexp.stringEqual(),
as.predexp.mapBin('categories'),
as.predexp.mapKeyIterateOr('cat'),
// Find any record that has a category yellow.
as.predexp.stringValue('yellow'),
as.predexp.stringVar('cat'),
as.predexp.stringEqual(),
as.predexp.mapBin('categories'),
as.predexp.mapKeyIterateOr('cat'),
// Now combine the two expression using and() to find records with categories blue AND yellow.
// Use or(2) if you want to find records that have categories blue OR yellow.
as.predexp.and(2)
]
// prints [ { green: 3, yellow: 4, blue: 2 } ]
await query.results()
.then(records => records.map(r => r.bins.categories))
.then(console.log)
client.close()
})
请注意,我使用的是mapKeyIterateOr
而不是mapKeyIterateAnd
。这是因为两个子表达式的每一个,我希望categories
映射的 any 键为blue
/ yellow
。如果您使用mapKeyIterateAnd
,则表示您希望地图的每个键都满足您的条件。