我是 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 扫描,这可能对我也有帮助。
谢谢!!