如何在Aerospike Node.js客户端中运行多个谓词mapkeys过滤器?

时间:2019-04-03 23:57:10

标签: aerospike

在Aerospike中,我需要基于mapkeys值运行查询,并按具有2个值的记录进行过滤

我的按一个值进行过滤的谓词看起来像这样,并且有效

predexp.stringValue('t3'),
predexp.stringVar('item'), 
predexp.stringEqual(),      
predexp.mapBin('category'),
predexp.mapKeyIterateAnd('item')  

我尝试使用“ and()”方法复制代码,但所有尝试均返回错误代码4

请帮忙吗?

1 个答案:

答案 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,则表示您希望地图的每个键都满足您的条件。