从 Aerospike Node.js 客户端检索主键

5
我正在尝试使用client.get()在Aerospike node.js客户端中检索主键。我已经通过将策略更改为Aerospike.policy.key.SEND(如此处此处所述)来使用client.put()插入记录。
现在我想检索记录以及主键。我尝试按照Aerospike文档中的说明进行操作,但似乎不起作用。
var key = aerospike.key(aerospikeDBParams.defaultNamespace,aerospikeDBParams.defaultSet,count);
    var readpolicy = {
        key: aerospike.policy.key.SEND
    }
    client.get(key, readpolicy, function(err, rec, meta){}

我得到了所有的容器,但没有主键。我是否漏掉了什么?
提前致谢。

2
嗨,Abhijith,如果您查看Client#get调用的API文档,您会发现此数据库操作的Client~recordCallback回调函数实际上有4个参数:function (error, record, metadata, key)。 - Jan Hecking
2个回答

5

函数的第四个参数是您想要的主键信息。

以我的代码为例:

  var readpolicy = {
      key: Aerospike.policy.key.SEND
  }
  var key = new Aerospike.Key(ns, set, "sel-fish")
  client.get(key, readpolicy, function (err, record, metadata, key) {
    if (null == err) {
      console.log("get ok")
      console.log(record)
      console.log(metadata)
      console.log(key)
    }
  })

输出结果为:
get ok
{ uid: 1000,
  name: 'sel-fish',
  dob: { mm: 12, dd: 29, yy: 1995 },
  friends: [ 1001, 1002, 1003 ],
  avatar: <Buffer 0a 0b 0c> }
{ ttl: 431997, gen: 3 }
Key { ns: 'test', set: '14', key: 'sel-fish', digest: null }

驱动程序的版本是aerospike@2.0.3


2

您正在查看旧版1.x客户端的文档。2.x客户端的文档位于http://www.aerospike.com/apidocs/nodejs/

只要键在写操作中被存储,您就可以通过后续读取操作获取它。

const Aerospike = require('aerospike')
function assertOk (error, message) {
  if (error) {
    console.error('ERROR - %s: %s [%s]\n%s', message, error.message, error.code, error.stack)
    throw error
  }
}

const Key = Aerospike.Key

Aerospike.connect({ hosts: '127.0.0.1:3000' }, function (error, client) {
  assertOk(error, 'Connecting to Aerospike cluster')

  var key = new Aerospike.Key('test', 'demo', 1)
  var bins = { a: 1, b: 2 }
  var policy = {
    key: Aerospike.policy.key.SEND
  }

  client.put(key, bins, {}, policy, function (error) {
    assertOk(error, 'Writing database record')

    client.get(key, function (error, record, meta) {
      assertOk(error, 'Reading database record')

      console.log(record, meta)
    })
  })
})

1
谢谢Ronen,但对我仍然不起作用。不确定我错过了什么。此外,当我在AQL中运行一个查询来选择像Select * from test.test这样的集合时,我会得到键和所有存储区。然而,当我尝试像select * from test.test where key=1这样的东西时,它会说“集合中没有记录”。我可以使用select * from test.test where PK=1检索记录。这是正常行为吗? - Abhijith S
1
PK是您需要的保留字。您可以使用“help”查看AQL的语法。您正在使用哪个版本的节点客户端? - Ronen Botzer
2
实际上,www.aerospike.com/docs/client/nodejs/ 的文档也已经更新,包括客户端版本 2。但是,它们更侧重于概念和用法的介绍;如果需要详细了解特定 API 调用的信息,最好还是查阅新的 API 文档 www.aerospike.com/apidocs/nodejs/ - Jan Hecking

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接