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

使用节点JS将新对象追加到迪纳摩DB中的 JSON 数组

公冶安怡
2023-03-14

我正在使用JSON结构来存储一个人的详细信息。基本上姓名,电话,注册时间戳等,将是其他属性,主键将是电子邮件地址。

MarkedLocation、visitedLocations、searchHistory和recommendation是AWS所称的列表或地图。它将包含许多JSON对象。

JSON结构-

{
    "name":"Mama Miya",
    "phone":"9383883223",
    "registeredTimestamp":"some-time",
    "lastActiveTimestamp":"some-time",
    "signinType":"facebook",
    "additionalSigninData":{
        "key1":"value1",
        "key2":"value2"
    },
    "markedLocations":[
        {
            "latitude":"77.33",
            "longitude":"12.33",
            "name":"Home",
            "description":"my new home",
            "placeid":"55334433",
            "image":"url/abc.png"
        }
    ]
}

在应用程序中,如果用户访问一个新位置,我需要向markedLocations添加一个新的JSON对象。所以标记的位置应该看起来像这样-

"markedLocations":[
    {
        "latitude":"77.33",
        "longitude":"12.33",
        "name":"Home",
        "description":"my new home",
        "placeid":"55334433",
        "image":"url/abc.png"
    },{
        "latitude":"22.11",
        "longitude":"22.55",
        "name":"Ocean",
        "description":"Ocean",
        "placeid":"32423423",
        "image":"url/icean.png"
    }
]

代码/模式-

var item = {
        'email': {'S': req.body.email},
        'phone': {'S': req.body.phone},
        'registeredTimestamp': {'S': req.body.registeredTimestamp},
        'lastActiveTimestamp': {'S': req.body.lastActiveTimestamp},
        'signinType': {'S': req.body.signinType},
        'version': {'S': req.body.version},
        'markedLocations': {'L': req.body.markedLocations}
    };

我查过了-

>

  • 在DynamoDB中,如何使用Java链接将元素附加到列表字段

    更新 AWS 动态数据库链接中的 JSON 数组

    使用节点 Js 链接更新发电机数据库中的集合

    如何使用节点js更新发电机数据库中的项目?链接

    并检查AWS文档中的UpdateItem API。我没有发现任何与我的问题/疑问相关的东西。

    请问有没有办法在NodeJS中给JSON数组追加一个新的JSON对象?我不能继续如何实现相同的。

    我是否应该为每个数组创建单独的表,并将电子邮件作为主键,将时间戳作为排序键并继续?

    PS:我是DynamoDB的新手,我以前使用过MongoDB,那里有使用JSON数组和对象的方法。在这里找不到路。

  • 共有1个答案

    宗政英才
    2023-03-14

    更新表达式中同时使用list_append() 和 if_not_exists() 以追加到可能不存在的列表列中:

    var AWS = require('aws-sdk')
    var DB = new AWS.DynamoDB.DocumentClient()
    
    function appendMarkedLocation (personId, location) {
      return DB.update({
        TableName: 'people',
        Key: { id: personId },
        ReturnValues: 'ALL_NEW',
        UpdateExpression: 'set #markedLocations = list_append(if_not_exists(#markedLocations, :empty_list), :location)',
        ExpressionAttributeNames: {
          '#markedLocations': 'markedLocations'
        },
        ExpressionAttributeValues: {
          ':location': [location],
          ':empty_list': []
        }
      }).promise()
    }
    
    appendMarkedLocation('somePeronId', {
      latitude: '22.11',
      longitude: '22.55',
      name: 'Ocean',
      description: 'Ocean',
      placeid: '32423423',
      image: 'url/icean.png'
    }).then(console.log)
    
     类似资料:
    • 我正在尝试从Lambda函数写入DynamoDB表。当我测试运行这个函数时,它返回null,没有错误消息,也没有任何东西写入表中。功能如下。我已经为这个功能设置了一个服务角色,它具有允许访问“产品”表的权限策略。我看到一些教程提到创建一个“AWS Lambda应用程序”,然后创建Lambda函数,但我不认为这对我的使用是必要的。 我还尝试过使用文档客户端 我得到的错误是:“发电机。文档客户端不是构

    • 我对这两个节点都不熟悉。js和MongoDB,但我已经设法将SO和mongo的文档中的一些部分整合在一起。 Mongo documentetion给出了一个例子: 如果我只需要在一个地方的一个函数中使用数据库,这看起来很好。在SO上搜索和阅读表明,我不应该每次都打开一个新连接,而是使用一个池并重用我第一次得到的数据库对象。这个答案在SO上很丰富,但我不确定如何首先获取DB对象,然后如何重用它。 假

    • 我正在尝试为ElasticCache启用VPC lambda函数以访问DynamicDB。我知道为此,我需要设置一个NAT网关。然而,我无法使它工作。我的专用子网在172.31..范围内。 以下是我遵循的步骤: < li >创建一个ip范围为10.0.0.0的公共子网。 < li >在上述相同的IP范围内创建一个公共VPC。 < li >在公共VPC创建公共互联网网关。 < li >创建一个公共路

    • 我正在尝试使用新的Amazon DynamoDB JSON API在称为“文档”的JSON属性中添加/覆盖键值对。理想情况下,我想简单地构建我的写入调用以发送KV对以添加到属性中,如果给定主键不存在该属性,则让Dynamo创建该属性。但是,如果我只使用简单的来尝试: 我得到了无效,这意味着DynamoDB无法找到要应用更新的名为“document”的给定属性。 我设法通过以下一系列调用来近似此功能

    • 我创建了一个小节点应用程序,从GitHub jobs API获取作业。我正在使用模块来完成此操作。您可以看到下面的代码: 如果您能帮助打印JSON对象,我将不胜感激,目前它只打印。

    • 问题是:“要求用户输入其国家的详细信息,使用输入的值创建一个国家的新对象,并将其附加到数组列表的开头。” 我确实遵循了最基本的规则来防止任何错误,但是当我试图编译时。它复制了一些像日本和美国这样的物体。尝试许多不同的方法来调试和理解问题,但我找不到。