无法扫描 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
中的项目。上面的查询将执行的操作。
包含不能用于对象或数组。
我是 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
中的项目。上面的查询将执行的操作。
包含不能用于对象或数组。