我正在使用 DynamoDB UpdateItem 来更新我的数据库中的记录。像这样的基本功能对我有用。

var user = {
    userID: '123213',
    name: 'John Doe',
    age: 12,
    type: 'creator'
};
var params = {
    TableName:table,
    Key:{
        "UserID": user.userID
    },
    UpdateExpression: "set Name = :r, Age=:p, Type=:a",
    ExpressionAttributeValues:{
        ":r":user.name,
        ":p":user.age,
        ":a":user.type
    },
    ReturnValues:"UPDATED_NEW"
};

docClient.update(params, function(err, data) {
    if (err) {
        console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2));
    } else {
        console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2));
    }
});

但是...

如果我只想更新一个属性,即名称,如下所示:
 var user = {
        userID: '123213',
        name: 'John Smith'
    };
var params = {
    TableName:table,
    Key:{
        "UserID": user.userID
    },
    UpdateExpression: "set Name = :r, Age=:p, Type=:a",
    ExpressionAttributeValues:{
        ":r":user.name,
        ":p":user.age,
        ":a":user.type
    },
    ReturnValues:"UPDATED_NEW"
};

它给了我这样的错误



我知道我可以通过检查用户中的值来动态生成 UpdateExpression 字符串,如下所示:
for (var key in user) {
  if (user.hasOwnProperty(key)) {
    ...add to DynamicUpdateExpression..
  }
}

但是有没有办法告诉 updateItem 忽略空值而只更新 name

最佳答案

我在问同样的问题……在 Java 中有 SaveBehavior.UPDATE_SKIP_NULL_ATTRIBUTES 但我在 nodejs 的 aws-sdk 中找不到类似的东西。

您可以使用 AttributeUpdates 而不是 UpdateExpression 来制定更清晰的解决方法:

const AWS      = require(aws-sdk);
const bluebird = require('bluebird');
const _        = require('lodash');

AWS.config.setPromisesDependency(bluebird);

const dynamodb = new AWS.DynamoDB.DocumentClient();

var skipNullAttributes = (attributes) => {
  return _.omitBy(attributes, (attr) => {
    return _.isNil(attr.Value);
  });
}

var update = (id, attributes) => {
  var params = {
    TableName       : 'MyTableName',
    Key             : { id: id },
    AttributeUpdates: skipNullAttributes(attributes)
  };

  return dynamodb.update(params).promise();
}

exports.handler = (event, context, callback) => {
  var body   = JSON.parse(event.body);
  var userId = event.pathParameters.id;

  var attributes = {
    firstName: { Action: 'PUT', Value: body.firstName },
    lastName : { Action: 'PUT', Value: body.lastName  }
  };

  update(userId, attributes)
    .then((result) => console.log(result) )
    .catch((error) => console.error(error) );

  callback(null, {statusCode: 200, body: JSON.stringify({message: 'done!'})});
}

关于amazon-web-services - DynamoDB : UpdateItem, 忽略 ExpressionAttributeValues 中的 Null 值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45842363/

10-11 06:53