我正在开发一个使用Aerospike和nodejs的项目。以前我一直在研究Nodejs和Mongodb(mongoose更具体)。
我遇到的用例很简单。假设集合中的记录包含名为"isReady"
和"time"
的分档。根据用户的特定操作,我想用" isReady"读取所有记录。 false并基于"time"
设置"isReady"
的某些条件为true。
如果在猫鼬中或者如果我们知道每条记录的关键字,这是非常简单的。
目前,我将主键作为记录的一部分存储为"reckey"
。请在不存储主键的情况下告知如何操作。
代码:
var client = getAeroSpikeClient();
var queryArgs = {
filters: [
filter.equal('isReady', false)
]
};
var query = client.query('ns', 'set', queryArgs)
var stream = query.execute();
var data = []
stream.on('data', function(record){
if (record)
data.push(record)
}):
stream.on('error', function(error) {
console.log('Error')
});
stream.on('end', function() {
$(data).each(function(i, it) {
if (it.time > 10)
it.isReady = true
client.put(it.reckey, it, function(err) {
if (err.code != aerospike.status.AEROSPIKE_OK)
console.log('Success')
})
})
)}
答案 0 :(得分:1)
这是将Record UDF应用于查询匹配的每条记录的一个很好的用例。这样,处理完全由服务器端完成,您不需要将所有记录提取到客户端并将其写回。
您可以在technical documentation中找到有关记录UDF的更多背景信息。 Node.js客户端的查询API记录在客户端API documentation中。
在您的特定用例中,您将使用background query:
var query = client.query(namespace, set)
query.where(Aeropspike.filter.equal('isReady', 0))
query.background('myUdfModule', 'updateIsReady', [10], (err, job) => {
if (err) throw err
job.waitUntilDone((err) => {
console.info('All done!')
})
})
updateIsReady
Lua函数看起来像这样:
function updateIsReady(rec, timeLimit)
if (rec['time'] > timeLimit) then
rec['isReady'] = 1
aerospike:update(rec)
end
end
首先需要使用客户端的udfRegister
方法向群集注册UDF模块。您还需要使用createIndex
在isReady
上创建整数索引。 (注意,Aerospike目前不支持布尔bin值。最好使用整数值0和1来表示isReady
。)
希望这有帮助!
答案 1 :(得分:0)
您只能在索引上添加条件(where子句)。默认情况下,只有PK被编入索引。如果您想基于isReady
和time
进行查询,可以在其上创建二级索引,它将起作用。 e.g。
select * from namespace.set where isReady = false
如果isReady不是二级索引,则无法进行此查询。