使用NodeJS的Redis聚合

r9f1avp5  于 5个月前  发布在  Redis
关注(0)|答案(1)|浏览(59)

我把哈希数据推到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解决这个问题吗?

30byixjq

30byixjq1#

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

const result = await redisClient.ft.aggregate(indexName, queryPattern, {
      STEPS: [{
        type: AggregateSteps.FILTER,
        expression: `${userList.map(username => `@username=='${username}'`).join(' || ')}`,
      }, {
        type: AggregateSteps.GROUPBY,
        properties: ['@pids'],
        REDUCE: [{
          type: AggregateGroupByReducers.TOLIST,
          property: '@username',
          AS: 'users',
        }],
      }],
    })
    logger.info('Got result\nSize: ', JSON.stringify(result.total))
    logger.debug('\nData: ' + JSON.stringify(result.results))
  } catch (error) {
    logger.error('Error:', error)
  }

字符串

相关问题