2017-08-23 2 views
1

Ich verwende DynamoDB UpdateItem, um Datensätze in meiner Datenbank zu aktualisieren. Eine grundlegende Funktion wie diese funktioniert für mich.DynamoDB: UpdateItem, Ignoriere Nullwerte in ExpressionAttributeValues ​​

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

Aber ...

Wenn ich möchte nur ein Attribut aktualisieren, den Namen, die wie folgt aus:

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

Es gibt mir die Fehlermeldung, dass

ExpressionAttributeValues ​​kann nicht NULL sein.

Ich weiß, dass ich dynamisch den UpdateExpression String durch Überprüfung für Werte in Benutzern, wie diese produzieren könnte:

for (var key in user) { 
    if (user.hasOwnProperty(key)) { 
    ...add to DynamicUpdateExpression.. 
    } 
} 

aber gibt es eine Möglichkeit, dass ich sagen kann, updateItem die Nullwerte zu ignorieren und nur Aktualisieren Sie die name?

Antwort

2

Ich stellte die gleiche Frage ... In Java gibt es die SaveBehavior.UPDATE_SKIP_NULL_ATTRIBUTES, aber ich konnte nichts dergleichen in aws-sdk für nodejs finden.

Sie könnten AttributeUpdates statt UpdateExpression verwenden eine sauberere Abhilfe zu machen:

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

Dies ist ein großer Vorschlag. Vielen Dank. Ich werde nur noch einen Tag warten, um zu sehen, ob jemand anders einen Weg gefunden hat, wenn nicht, dann werde ich diese Antwort ausschließen. – inspired

+0

Haben Sie etwas dazu gefunden? Ich konnte nichts finden. –

+0

Ich habe nichts gefunden. Ich werde es akzeptieren. – inspired

Verwandte Themen