我把哈希数据推到Redis,我想对数据应用group by并获得结果
假设我在redis上有以下数据,作为哈希,关键字为'3801'
HSET "3801:1" username "albert" pids "11,12"
HSET "3801:2" username "bob" pids "11,12"
HSET "3801:3" username "casey" pids "13,14"
HSET "3801:4" username "david" pids "13"
字符串
我想创建索引并根据pid对它们进行分组。因此,当我将输入作为3801传递时,我需要以下结果(在键内)
albert,bob
casey
david
型
- Redis Create命令:*
FT.CREATE 3801:idx ON HASH PREFIX 1 3801: SCHEMA username TEXT SORTABLE pids TEXT SORTABLE
型
- Redis聚合命令:*
FT.AGGREGATE 3801:idx '*' GROUPBY 1 '@pids' REDUCE TOLIST 1 '@username' AS 'users'
型
这些redis命令工作得很好。
我用来创建索引的NodeJ代码
redisClient.ft.create('3801:idx', {
username: {
type: SchemaFieldTypes.TEXT,
SORTABLE: true,
},
pids: {
type: SchemaFieldTypes.TEXT,
SORTABLE: true,
},
}, {
ON: 'HASH',
PREFIX: '3801:',
})
型
从日志中生成的create redis命令:
"FT.CREATE" "3801:idx" "ON" "HASH" "PREFIX" "1" "3801:" "SCHEMA" "username" "TEXT" "SORTABLE" "pids" "TEXT" "SORTABLE"
型
并且对于聚集,
const result = await new Promise((resolve, reject) => {
redisClient.ft.aggregate('3801:idx', '*', {
STEPS: [{
type: AggregateSteps.GROUPBY,
properties: ['@pids'],
REDUCE: [{
type: AggregateGroupByReducers.TOLIST,
property: '@username',
AS: 'users',
}],
}],
}, (err, result) => {
if (err) {
reject(err)
} else {
resolve(result)
}
})
})
console.log('got result:', JSON.stringify(result))
型
此代码生成以下内容
"FT.AGGREGATE" "3801:idx" "*" "GROUPBY" "1" "@pids" "REDUCE" "TOLIST" "1" "@username" "AS" "users"
型
看起来生成的命令是正确的。我只是通过将此复制到redis-browser并运行来确认它。我得到了预期的结果。但NodeJS代码没有返回结果
来自RedisInsight的数据截图
x1c 0d1x的数据
有人能帮助我如何使用NodeJs解决这个问题吗?
1条答案
按热度按时间30byixjq1#
我只是删除了被聚合调用包围的Promise处理程序,它工作得很好
字符串