使用NodeJS的Redis聚合

r9f1avp5  于 2024-01-06  发布在  Redis
关注(0)|答案(1)|浏览(146)

我把哈希数据推到Redis,我想对数据应用group by并获得结果
假设我在redis上有以下数据,作为哈希,关键字为'3801'

  1. HSET "3801:1" username "albert" pids "11,12"
  2. HSET "3801:2" username "bob" pids "11,12"
  3. HSET "3801:3" username "casey" pids "13,14"
  4. HSET "3801:4" username "david" pids "13"

字符串
我想创建索引并根据pid对它们进行分组。因此,当我将输入作为3801传递时,我需要以下结果(在键内)

  1. albert,bob
  2. casey
  3. david

  • Redis Create命令:*
  1. FT.CREATE 3801:idx ON HASH PREFIX 1 3801: SCHEMA username TEXT SORTABLE pids TEXT SORTABLE

  • Redis聚合命令:*
  1. FT.AGGREGATE 3801:idx '*' GROUPBY 1 '@pids' REDUCE TOLIST 1 '@username' AS 'users'


这些redis命令工作得很好。
我用来创建索引的NodeJ代码

  1. redisClient.ft.create('3801:idx', {
  2. username: {
  3. type: SchemaFieldTypes.TEXT,
  4. SORTABLE: true,
  5. },
  6. pids: {
  7. type: SchemaFieldTypes.TEXT,
  8. SORTABLE: true,
  9. },
  10. }, {
  11. ON: 'HASH',
  12. PREFIX: '3801:',
  13. })


从日志中生成的create redis命令:

  1. "FT.CREATE" "3801:idx" "ON" "HASH" "PREFIX" "1" "3801:" "SCHEMA" "username" "TEXT" "SORTABLE" "pids" "TEXT" "SORTABLE"


并且对于聚集,

  1. const result = await new Promise((resolve, reject) => {
  2. redisClient.ft.aggregate('3801:idx', '*', {
  3. STEPS: [{
  4. type: AggregateSteps.GROUPBY,
  5. properties: ['@pids'],
  6. REDUCE: [{
  7. type: AggregateGroupByReducers.TOLIST,
  8. property: '@username',
  9. AS: 'users',
  10. }],
  11. }],
  12. }, (err, result) => {
  13. if (err) {
  14. reject(err)
  15. } else {
  16. resolve(result)
  17. }
  18. })
  19. })
  20. console.log('got result:', JSON.stringify(result))


此代码生成以下内容

  1. "FT.AGGREGATE" "3801:idx" "*" "GROUPBY" "1" "@pids" "REDUCE" "TOLIST" "1" "@username" "AS" "users"


看起来生成的命令是正确的。我只是通过将此复制到redis-browser并运行来确认它。我得到了预期的结果。但NodeJS代码没有返回结果
来自RedisInsight的数据截图
x1c 0d1x的数据
有人能帮助我如何使用NodeJs解决这个问题吗?

30byixjq

30byixjq1#

我只是删除了被聚合调用包围的Promise处理程序,它工作得很好

  1. const result = await redisClient.ft.aggregate(indexName, queryPattern, {
  2. STEPS: [{
  3. type: AggregateSteps.FILTER,
  4. expression: `${userList.map(username => `@username=='${username}'`).join(' || ')}`,
  5. }, {
  6. type: AggregateSteps.GROUPBY,
  7. properties: ['@pids'],
  8. REDUCE: [{
  9. type: AggregateGroupByReducers.TOLIST,
  10. property: '@username',
  11. AS: 'users',
  12. }],
  13. }],
  14. })
  15. logger.info('Got result\nSize: ', JSON.stringify(result.total))
  16. logger.debug('\nData: ' + JSON.stringify(result.results))
  17. } catch (error) {
  18. logger.error('Error:', error)
  19. }

字符串

展开查看全部

相关问题