无法扫描 DynamoDB 映射嵌套属性

Can't scan on DynamoDB map nested attributes

我是 DynamoDB 的新手,我正在尝试使用 Dynamoose 库从 javascript 查询 table。我有一个 table,它有一个名为 "id" 的字符串类型的主分区键,它基本上是一个带有用户 ID 的长字符串。我在 table 中有一个名为 "attributes" 的第二列,它是一个 DynamoDB 映射,用于存储任意用户属性(我无法更改模式,因为这是预定义的持久性适配器的工作方式,我为了方便起见,我坚持使用它)。 这是 table:

中的记录示例
Item{2}
  attributes Map{2}
      10 Number:    2
      11 Number:    4
      12 Number:    6
      13 Number:    8
  id String: YVVVNIL5CB5WXITFTV3JFUBO2IP2C33BY

Map中的数值字段,如“12”字段,可以解释为"week10"、"week11"、"week12"和"week13",而数值值 2、4、6 和 8 是应用程序在该周启动的次数。

我需要做的是获取特定周(例如第 12 周)启动次数超过 4 次的记录的所有用户 ID,我还需要获取总计 20 次启动的用户 ID 列表在四个星期的范围内(例如从第 10 周到第 13 周)。

对于 Dynamoose,我必须使用以下模型:

dynamoose.model(
    DYNAMO_DB_TABLE_NAME, 
    {id: String, attributes: Map},
    {useDocumentTypes: true, saveUnknown: true}
);

(以匹配我正在使用的持久性适配器生成的 table 结构)。 我假设我需要做 DynamoDB "scan" 来实现这个而不是 "query" 我尝试这个开始并获得第 12 周等于 6 的记录无济于事(我得到一个空集作为结果):

const filter = {
        FilterExpression: 'contains(#attributes, :val)',
        ExpressionAttributeNames: {
          '#attributes': 'attributes',
        },
        ExpressionAttributeValues: {
          ':val': {'12': 6},
        },
      };

    model.scan(filter).all().exec(function (err, result, lastKey) {
        console.log('query result: '+ JSON.stringify(result));
    });

如果您不了解 Dynamoose,但可以通过 AWS SDK 帮助解决此问题,请直接 运行 扫描 DynamoDB,这可能对我也有帮助。

谢谢!!

试试下面的方法。

const filter = {
    FilterExpression: '#attributes.#12 = :val',
    ExpressionAttributeNames: {
        '#attributes': 'attributes',
        '#12': '12'
    },
    ExpressionAttributeValues: {
        ':val': 6,
    },
};

听起来您真正想做的是过滤 attributes.12 = 6 中的项目。上面的查询将执行的操作。

包含不能用于对象或数组。