【问题标题】:Scan dynamodb table based on filter which is not present in all object基于并非所有对象中都存在的过滤器扫描 dynamodb 表
【发布时间】:2022-02-10 00:12:59
【问题描述】:

所以我正在尝试根据角色过滤我的 dynamoDb 数据,因为您可以看到角色属性存在于某些并非全部的对象中


[
  {
    id: "7",
    email: 'test1@gmail.com',
    name: 'test1',
    age: '12',
  },
  {
    id: "8",
    email: 'test2@gmail.com',
    name: 'test2',
    age: '12',
  },
  {
    email: 'test3@gmail.com',
    name: 'test3',
    age: '12',
    test: 'test',
    role: 'ADMIN'
  },
  {
    email: 'test4@gmail.com',
    name: 'test4',
    age: '12',
    test: 'test',
    role: 'ADMIN'
  }
]

如果我尝试使用 email 进行扫描,它可以工作,但如果我尝试使用 role 进行扫描,则会出现错误: 无效的FilterExpression:属性名称是保留关键字;保留关键字:角色

我尝试了代码

let params = {
  TableName: 'tableName',
  FilterExpression: 'role =:role',
  ExpressionAttributeValues: { ':role': 'ADMIN' },
  expressionAttributeNames: { '#role': 'role' }
}
let result = await this.docClient.scan(params).promise();

还有这个

let params = {
  TableName: 'tableName',
  FilterExpression: 'attribute_not_exists(role)',
  ExpressionAttributeValues: { ':role': 'ADMIN' },
  expressionAttributeNames: { '#role': 'role' }
}
let result = await this.docClient.scan(params).promise();

都给我同样的错误

【问题讨论】:

  • 是保留关键字,不能使用。您可以将'#r = :role' 用于过滤器表达式,将'#r':'role' 用于名称映射。还有错别字:expressionAttributeNames。
  • 感谢它的作品

标签: node.js dynamodb-queries aws-sdk-js amazon-dynamodb


【解决方案1】:

我相信您的第一个代码 sn-p 中有错字。 FilterExpression: 'role =:role', 应该是 FilterExpression: '#role =:role',

所以以下应该可以工作,

let params = {
  TableName: 'tableName',
  FilterExpression: '#role =:role',
  ExpressionAttributeValues: { ':role': 'ADMIN' },
  ExpressionAttributeNames: { '#role': 'role' }
}
let result = await this.docClient.scan(params).promise();

【讨论】:

    猜你喜欢
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 2016-08-05
    • 1970-01-01
    相关资源
    最近更新 更多