我是AWS DynamoDB的初学者,我想用SENDTO.emailAddress =" first@first.com"扫描DynamoDB。作为FilterExpression。
数据库结构如下所示
{
ID
NAME
MESSAGE
SENDTO[
{
name
emailAddress
}
]
}
样本数据
{
ID: 1,
NAME: "HELLO",
MESSAGE: "HELLO WORLD!",
SENDTO: [
{
name: "First",
emailAddress: "first@first.com"
},
{
name: "Second",
emailAddress: "second@first.com"
}
]
}
我想检索与emailAddress匹配的文档。我尝试使用过滤器表达式扫描,这是我的代码来检索数据。我正在使用AWS Javascript SDK。
let params = {
TableName : "email",
FilterExpression: "SENDTO.emailAddress = :emailAddress",
ExpressionAttributeValues: {
":emailAddress": "first@first.com",
}
}
let result = await ctx.docClient.scan(params).promise();
答案 0 :(得分:2)
要按sendto
属性查找项目,您需要知道name
和emailAddress
属性值。 DynamoDB无法仅通过对象中的一个属性(即email
属性值)来查找数据。
CONTAINS 函数可用于查找List数据类型中的数据。
列表支持CONTAINS:评估“a CONTAINS b”时,“a” 可以是一个清单;但是,“b”不能是集合,地图或列表。
使用包含的示例代码: -
var params = {
TableName: "email",
FilterExpression: "contains (SENDTO, :sendToVal)",
ExpressionAttributeValues: {
":sendToVal": {
"name" : "First",
"emailAddress" : "first@first.com"
}
}
};
如果您不知道name
和emailAddress
属性的值,则可能需要重新构建数据以满足您的使用案例。
答案 1 :(得分:1)
我认为您应该为用户和邮件创建两个表。
用户表包含partition_key:user_id和sort_key:email以及包含其邮件ID数组的字段。
消息表包含partition_key:message_id和包含用户ID数组的字段。
当您获得用户ID数组时,您可以使用 BATCH GET 查询来获取一条消息的所有用户。
当您获得消息ID数组时,您可以使用 BATCH GET 查询来获取一个用户的所有消息。
如果您想通过电子邮件获得一位用户,可以使用 QUERY 方法。