当前位置: 首页 > 知识库问答 >
问题:

DynamoDB在查询上重新映射列表属性项

宋洲
2023-03-14
{
    "Id": 1
    "Items": [ "item-1", "item-2", "item-3" ]
},
{
    "Id": 2,
    "Items": [ "item-x" ]
},
{
    "Id": 3,
    // "Items" is potentially optional
}
// ...

exports.handler = async (event, context) => {
    return dynamoDoc.query({
        TableName                 : 'some-table',
        Select                    : 'SPECIFIC_ATTRIBUTES',
        KeyConditionExpression    : 'Id = :id',
        ExpressionAttributeValues : {
            ':id' : event.Id,
        },
        ProjectionExpression : `
            Id,
            Items[0]
        `,
    }).promise();
};
"Items": [
    {
        "Id": 1,
        "Items": [
            "item-1"
        ]
    },
    {
        "Id": 2,
        "Items": [
            "item-x"
        ]
    },
    {
        "Id": 3
    }
]

是否有一种方法可以使用某种表达式重新映射属性名称,以便以以下形式获得数据输出:

Items: [
    {
        "Id": 1,
        "FirstItem: "item-1"
    },
    {
        "Id": 2,
        "FirstItem: "item-x"
    },
    {
        "Id": 3
    }
]

我目前使用JavaScript的array.foreach处理数据,但是,我试图避免这种情况,而宁愿利用DynamoDB进行计算。

共有1个答案

闽承望
2023-03-14

没门。

最佳实践是创建一个类似存储库的帮助函数,该帮助函数将所有查询包装到Dynamodb中,并为处理程序函数返回final对象。

快速修复,使用.map而不是.foreach

exports.handler = async (event, context) => {
  const result = await dynamoDoc.query({
    TableName: 'some-table',
    Select: 'SPECIFIC_ATTRIBUTES',
    KeyConditionExpression: 'Id = :id',
    ExpressionAttributeValues: {
      ':id': event.Id,
    },
    ProjectionExpression: `
            Id,
            Items[0]
        `,
  }).promise();

  result.Items = result.Items.map((i) => {
    return {
      Id: i.Id,
      FirstItem: i.Items && i.Items.length ? i.Items[0] : undefined,
    }
  });

  return result; // final result
};
 类似资料:
  • 因此,我在DynamoDB中有一项: 我想添加一个新的属性到上述项目,属性是: 现在,我在JS中使用AWS-SDK这样做: 但是,我得到一个错误: ExpressionAttributeValue包含无效值:一个或多个参数值无效:AttributeValue不能包含key:newAttr的空字符串 所以如果我是这样就可以了,但我不希望这个新属性是一个字符串,我希望它是一个列表。 那么我做错了什么?

  • 我最近开始使用mapstruct,在编码时我坚持使用一个场景。为了解决下面默认方法之间的模糊性,我试图在列表中使用“限定由” 但是第1行显示错误,因为需要指定“target”。我不确定这里的目标应该是什么,因为Line是一个集合对象。即使我不使用@mapping,mapstuct也会生成mapper实现。我阅读了mapstuct文档,但对这个场景了解不多。如何在列表上使用命名注释来明确表示这是要使

  • 我的域类中有一个map属性,我正在尝试在存储库中创建一个查询,或者使用默认的“findByBlah”语法从数据库中提取属性。目前不起作用。我可以很容易地用SQL编写查询,但我不知道JPQL需要什么。如何使用JPQL或接口“findBy”语法从数据库中提取这些数据?无论我当前使用哪种存储库方法,当它从数据库中提取“收集器”时,属性(映射或复杂对象列表)始终为空。 域对象: 存储库: 这是在H2控制台

  • 我使用静态编程语言反射来检查具有特定注释的属性是否为空。 给出以下示例: 以及检查它的函数: 这个想法是,函数将迭代我的类的属性,检查它们是否有注释,并检查值是否为空。如果属性是一个数据类,代码会递归地计算Childs的属性。 之后,我映射结果,将KProperty转换为一个简单的字符串,该字符串可供人阅读,包含类名和属性名。 问题是上面的代码没有按预期工作。返回的属性只是来自第一级类的属性。 如

  • 我对此代码的唯一关注是,它需要一个新表来连接和,我希望避免这种行为(但如果确实不可能的话,就继续执行它)。 使用也是不可行的,因为它需要表中的其他列,而且这个表稍后将被许多其他实体使用。 因此,使用数据示例,如果在我的表中有一个have: 在Java中,我的列表应该有两个条目(可用的两种语言)。 这种行为在JPA中可能吗? 解决方案 现在一切都按预期工作。

  • 我有一个dynamodb表,它的一个属性包含一个嵌套的映射,我想更新一个特定的库存项目,该项目通过一个过滤器表达式进行过滤,从而从该映射中生成一个项目。 如何编写一个更新表达式来更新位置到名称=欧宝的项目的“就位三”,标签包括“x1”(也可能是f3)?这应该只更新第一个列表元素位置属性。