Cómo usar la statement “IN” en FilterExpression usando array – dynamodb

Revisé el documento de AWS pero no encontré ningún ejemplo de trabajo.

Aquí está mi bash

var params = { TableName: "User", IndexName:"ab-index", KeyConditionExpression: "Country = :country and #s = :status", FilterExpression: "Id IN (:e)", ExpressionAttributeValues: { ":country ": "USA", ":status": 1, ":e": "1" }, ExpressionAttributeNames: {"#s": "Status"} }; //get users dynamodb.query(params, function (err, data) { if (err) //error else { //success } }); 

Obtuve registros pero está recuperando registros que tienen ID 1 pero quiero usar una matriz como esta

  var params = { TableName: "User", IndexName:"ab-index", KeyConditionExpression: "Country = :country and #s = :status", FilterExpression: "Id IN (:e)", ExpressionAttributeValues: { ":country ": "USA", ":status": 1, ":e": ["1","2","3"] }, ExpressionAttributeNames: {"#s": "Status"} }; //get users dynamodb.query(params, function (err, data) { if (err) //error else { //success } }); 

¿Cómo se puede hacer que el código anterior esté funcionando? ¿Quieres obtener registros? la syntax es correcta y la consulta se ejecuta sin error, pero no obtengo registros

Por favor refiera esta respuesta

Resumen:-

Para un número fijo de valores en la cláusula “IN”:

 var params = { TableName : "Users", FilterExpression : "username IN (:user1, :user2)", ExpressionAttributeValues : { ":user1" : "john", ":user2" : "mike" } }; 

Para obtener más elementos en la matriz y formar la FilterExpression dinámicamente: –

 var titleValues = ["The Big New Movie 2012", "The Big New Movie"]; var titleObject = {}; var index = 0; titleValues.forEach(function(value) { index++; var titleKey = ":titlevalue"+index; titleObject[titleKey.toString()] = value; }); var params = { TableName : "Movies", FilterExpression : "title IN ("+Object.keys(titleObject).toString()+ ")", ExpressionAttributeValues : titleObject }; 

La respuesta de Notionquest es correcta, pero no puedo usar mis otros valores en ExpressionAttributeValues como :country y :status por lo que aquí se modifica la respuesta para que funcione según mis requisitos

 var AttributeValuesObject = {}; AttributeValuesObject[':country '] = "USA"; AttributeValuesObject[':status'] = 1; var titleValues = ["1", "2"]; var titleObject = {}; var index = 0; titleValues.forEach(function(value) { index++; var titleKey = ":titleValue"+index; AttributeValuesObject[titleKey.toString()] = value; titleObject[titleKey.toString()] = value; }); var params = { TableName: "User", IndexName:"ab-index", KeyConditionExpression: "Country = :country and #s = :status", FilterExpression: "Id IN ("+Object.keys(titleObject).toString()+ ")", ExpressionAttributeValues: AttributeValuesObject, ExpressionAttributeNames: {"#s": "Status"} }; //get users dynamodb.query(params, function (err, data) { if (err) //error else { //success } }); 

Usando es5 y el mapa:

 const params = { TableName: 'personalizations', KeyConditionExpression: 'accountId = :accountId', FilterExpression: `websiteId IN (${websites.map(w => `:${w.websiteId}`).join(',')})`, ExpressionAttributeValues: {':accountId': accountId} } for (const website of websites) { params.ExpressionAttributeValues[`:${website.websiteId}`] = website.websiteId } const {Items: personalizations} = await docClient.query(params).promise()