是否可以在Aerospike中搜索以特定前缀开头的所有键?

时间:2016-05-13 03:23:51

标签: database aerospike

所以我希望将现有的redis数据建模为aerospike。我们的一个要求是能够获得给定用户的所有密钥。例如,假设我们有<id>:<timestamp>等密钥。现在,在某个时间点,我需要获取给定id的所有密钥,我需要在aerospike命名空间(已编制索引)中的所有键上搜索前缀,以获取所有值<id>:<timestamp>个键。想知道这是否可能,如果是,如何。感谢。

1 个答案:

答案 0 :(得分:5)

您无法直接对密钥前缀进行查询。服务器仅存储密钥摘要,因此密钥值(在您的情况下为<id>:<timestamp>)不会被索引。

对此进行建模的方法是将密钥的<id>部分添加为单独的记录箱。然后,您可以索引该bin并对其运行查询。

这是一个简单的例子 - 它使用的是Aerospike Node.js客户端,但无论您喜欢哪个客户端,概念都是相同的:

const Aerospike = require('aerospike')

const ns = 'test'
const set = 'demo'

// connect to cluster and create index on 'id' bin
var client = Aerospike.client()
client.connect((err) => {
  assertOk(err, 'connecting to cluster')
  createIndex('id', 'id_idx', Aerospike.indexDataType.STRING, () => {

    // create a new sample record
    var userId = 'user1'
    var ts = new Date().getTime()
    var key = new Aerospike.Key(ns, set, `${userId}:${ts}`)
    var record = { id: userId, value: Math.random() }
    client.put(key, record, (err) => {
      assertOk(err, 'write record')

      // query for records with matching 'id'
      var query = client.query(ns, set)
      query.where(Aerospike.filter.equal('id', userId))
      var stream = query.foreach()
      stream.on('error', (error) => assertOk(error, 'executing query'))
      stream.on('end', () => client.close())
      stream.on('data', (record, meta, key) => {
        console.log(record)
      })
    })
  })
})

function assertOk (err, message) {
  if (err) {
    console.error('ERROR: %s - %s', message, err)
    process.quit()
  }
}

function createIndex (bin, name, datatype, callback) {
  var index = {
    ns: ns,
    set: set,
    bin: bin,
    index: name,
    datatype: datatype
  }
  client.createIndex(index, (err, job) => {
    assertOk(err, 'creating index')
    job.waitUntilDone(100, (err) => {
      assertOk(err, 'creating index')
      callback()
    })
  })
}

希望这有帮助!