0

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

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

(以匹配我正在使用的持久性适配器生成的表结构)。我假设我需要进行 DynamoDB“扫描”来实现这一点,而不是“查询”,我尝试了这个开始并获得第 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 开发工具包帮助解决此问题,请直接运行 DynamoDB 扫描,这可能对我也有帮助。

谢谢!!

4

1 回答 1

1

试试下面的。

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

听起来你真正想做的是过滤attributes.12 = 6. 这就是上面的查询将执行的操作。

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

于 2020-04-16T23:04:52.310 回答