根据不存在于所有对象中的过滤器扫描 dynamodb table

Scan dynamodb table based on filter which is not present in all object

所以我正在尝试根据角色过滤我的 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:属性名称是保留关键字;保留关键字:role

我试过代码

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();

都给我同样的错误

我认为您的第一个代码片段中有错字。 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();