如何更新()DynamoDB

时间:2017-01-24 20:03:03

标签: node.js amazon-dynamodb

我第一次使用DynamoDB,到目前为止,还不错。对Node有一定的了解使得这更容易,但没有noSQL,这很痛!我的应用程序依赖于快速搜索GROUPS列表并返回该组中的成员。

当我使用控制台添加数据时,我能够创建如下的JSON文档:

"GROUP_ID":"GroupA", "MEMBER": ["MemberA", "MemberB", "MemberC"], "STATUS": ["OWNER", "MEMBER", "INVITED"], "ADD_DATE":[1234567, 2345671, 3456712]

我使用它来创建GROUP_ID作为主键:

const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient({region:'us-east-1'});

exports.handler = (event, context, callback) => {

    var tableName = "USER_GROUPS";
    var checkParams = {
        TableName: tableName,
        Key:{"GROUP_NAME": event.group_id}
    };
    var createParams = {
        TableName: tableName,
        Key:{"GROUP_NAME": event.group_id},
        Item:{"GROUP_NAME": event.group_id, "MEMBER_NAME":[event.device_id], "MEMBER_SATUS":["OWNER"], "MEMBER_DATE" : [event.date]}
    };

    var checkGroupExists = new Promise((resolve, reject) => {
        docClient.get(checkParams, (err, data) => {
            if(err){
                reject(err);
            }
            if(data.Item){  // exists... 
                console.log("found Group ID");
                reject();
            }
            else{
                console.log("Group ID not found...");
                resolve();
            }
        });
    });

    checkGroupExists.then((err, data) => {
        console.log("adding Group: ");
        console.log(data);
        docClient.put(createParams, (err, data) =>{
            if(err){
                console.log(err);
                callback(err, null);
            }else{
                console.log("added device: " + createParams.Key);
                callback(null, {"created":createParams.Key.GROUP_NAME});
            }
        });
    }).catch((err) => {
        if(err){
            callback(err, null);
        }
        else{
            callback(err, {"used":createParams.Key.GROUP_NAME});
        }
    });
};

但是当我使用update()时,我将添加到数组中,最后得到数组的类型名称

["S":"MemberA", "S":"MemberB", "S":"MemberC"]

有点......

这是我离开的地方,在这里非常沮丧!

const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient({region:'us-east-1'});

exports.handler = (event, context, callback) => {

    var tableName = "USER_GROUPS";
    var checkParams = {
        TableName: tableName,
        Key:{"GROUP_NAME": event.group_id},
        Item:{"MEMBER_NAME": event.member_name}
    };
    var updateParams = {
        TableName: tableName,
        Key:{"GROUP_NAME": event.group_id},
        //Item:{"MEMBER_NAME":[event.device_id], "MEMBER_STATUS":["OWNER"], "MEMBER_DATE" : [event.date]},
        AttributeUpdates: {
            "MEMBER_NAME": {
                Action: 'ADD',
                Value: event.device_id
            },
            "MEMBER_STATUS":{
                Action : 'ADD',
                Value: "ENVITED"
            },
            "MEMBER_DATE":{
                Action: 'ADD',
                Value: event.date
            }
        },
    };



    var checkGroupExists = new Promise((resolve, reject) => {
        docClient.get(checkParams, (err, data) => {
            console.log(data);
            if(err){
                reject(err);
            }
            if(data.Item.GROUP_NAME){  // exists... 
                console.log("found the group...");
                resolve();
            }
            else{
                reject();
            }
        });
    });

    checkGroupExists.then((err, data) => {
        docClient.update(updateParams, (err, data) =>{
            if(err){
                console.log(err);
                callback(err, null);
            }else{
                callback(null, {"updated" : updateParams.Key.GROUP_NAME});
            }
        });
    }).catch((err) => {
        if(err){
            callback(err, null);
        }
        else{
            callback(err, {"noGroup":createParams.Key.GROUP_NAME});
        }
    });
};

似乎我对如何处理更新以理解成员数组中的NEW项目缺乏了解。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

list_append()中一起使用UpdateExpressionConditionExpression一起附加到列表列,以防止更新不存在的组:

const AWS = require('aws-sdk');
const DB = new AWS.DynamoDB.DocumentClient({region:'us-east-1'});
const UpdateExpression = 'SET ' + [
  '#members = list_append(#members, :member)',
  '#statuses = list_append(#statuses, :status)',
  '#dates = list_append(#dates, :date)',
].join(', ')
const ConditionExpression = [
  'attribute_type(#members, :L)',
  'attribute_type(#statuses, :L)',
  'attribute_type(#dates, :L)'
].join(' AND ')
const ExpressionAttributeNames = {
  '#members': 'MEMBER_NAME',
  '#statuses': 'MEMBER_STATUS',
  '#dates': 'MEMBER_DATE'
}

exports.handler = (event, context, callback) => {
  DB.update({
    TableName: 'USER_GROUPS',
    Key: { GROUP_NAME: e.group_id },
    ReturnValues: 'ALL_NEW',
    UpdateExpression: UpdateExpression,
    ConditionExpression: ConditionExpression,
    ExpressionAttributeNames: ExpressionAttributeNames,
    ExpressionAttributeValues: {
      ':member': [e.member_name],
      ':status': ['ENVITED'],
      ':date': [e.date],
      ':L': 'L'
    }
  }, callback)
}