2017-07-25 32 views
0

我对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); 
}; 

但是,我不能更新现有条目或从地图上删除数据。下面的代码也不检查重复项。有没有更好的方法来做到这一点?

+0

你能提供你有错误信息吗? –

+0

列表不检查重复项。只设置检查重复项(SS或NS)。 – notionquest

+0

谢谢@notionquest。我做了一个解决方法。对于删除,我找出必须删除的索引并使用remove表达式和call update。类似地,对于重复检查,我解析整个列表并查看是否已有该名称的条目,并且如果条目已存在且电话号码相同,则不创建新条目。 –

回答

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); 
 
};

这是一种解决方法,但我找不到这样做的任何其他方式那。