2017-01-24 87 views
0

我正在与DynamoDB进行首次合作,至今也不错。对Node有一些了解可以让这个变得更容易,但是没有noSQL,那么会很痛!我的应用程序依赖于快速搜索组列表并返回该组中的成员。如何更新()DynamoDB

当我添加使用控制台中的数据,我可以创造一个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}); 
     } 
    }); 
}; 

但是当我使用更新()我添加到阵列,并用类型名称为这样的阵列

["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项目。任何援助将不胜感激!

回答

0

使用list_append()UpdateExpression一起追加到一个列表列有ConditionExpression一起阻止更新一个不存在的组:

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) 
} 
+0

哇,感谢您的..完全重构,令人叫绝。我看到“errorMessage”:“条件请求失败”,“errorType”:“ConditionalCheckFailedException”,我很难理解那里的语法! –

+0

@JimfromPrinceton该错误应该表明您尝试更新的行不存在。 – idbehold

+0

谢谢我使用上面发布的第一个lambda创建了一行。然后,尝试在您的代码中使用相同的密钥“GROUP_NAME”,我只会遇到该错误。我不得不说,这根本不直观! PS。我不得不更新.handler中的事件变量名称,但我认为这不重要...... –