将DynamoDB中的数据组织为地图列表

时间:2017-07-25 07:12:48

标签: javascript maps amazon-dynamodb

我是DynamoDB的新手。我正在尝试组织我的数据库,使其如下所示:

{
   userId : userID,
   phoneMap :
   [
      { 
         name: Joe,
         phone: +16712232312
  },
  {
     name: Ron,
     phone: +18972345126
  }
   ]
}

我可以使用以下代码将数据添加到名为phoneMap的列表中:

EntryService.prototype.update = function (userId, name, phone, cb) {
  var phoneMapToAdd = {
    name: name,
    phone: phone
  };

  this.dynamodb.update({
    TableName: "phoneMapTable",
    Key: { "userId": userId },
    UpdateExpression: "SET #phoneMap = list_append(#phoneMap, :entry)",
    ExpressionAttributeNames: { "#phoneMap": "phoneMap" }, 
    ExpressionAttributeValues: { ":entry": [phoneMapToAdd] },
  }, cb);
};

但是,我无法更新现有条目或从地图中删除数据。以下代码也不检查重复项。有没有更好的方法呢?

1 个答案:

答案 0 :(得分:0)

我做了一个解决方法。我搜索了很多,并意识到使用我的DynamoDB结构,我不能简单地更新任何联系人。我需要在列表中找到要更新的索引,然后将其删除,然后将更新后的联系人添加为新联系人。

EntryService.prototype.delete = function (userId, indx, cb) {
  var params = {
    TableName: "phoneMapTable",
    Key: {
      "userId": userId
    },
    UpdateExpression: "REMOVE phoneMap["+indx+"]",
    ReturnValues: "UPDATED_NEW"
  };
  this.dynamodb.update(params, cb);
};

然后我将它添加到我已经存在的列表中,如

EntryService.prototype.append = function (userId, name, phone, cb) {
  var phoneMapToAdd = {
    name: name,
    phone: phone
  };
  console.log(phoneMapToAdd);
  this.dynamodb.update({
    TableName: "phoneMapTable",
    Key: { "userId": userId },
    UpdateExpression: "SET #phoneMap = list_append(#phoneMap, :entry)",
    ExpressionAttributeNames: { "#phoneMap": "phoneMap" }, 
    ExpressionAttributeValues: { ":entry": [phoneMapToAdd] },
  }, cb);
};

这是一种解决方法,但我找不到任何其他方法。