Indagamos en diferentes foros y de este modo regalarte la respuesta a tu duda, si tienes alguna difcultad deja la pregunta y te respondemos con mucho gusto.
Solución:
Debes hacer uso de la IN
operador. También es más fácil usar marcadores de posición para attribute nombres y attribute valores. Sin embargo, desaconsejaría el uso de un Scan
en este caso. Parece que ya tienes el hash key attribute valores que desea encontrar, por lo que tendría más sentido utilizar BatchGetItem
.
De todos modos, así es como lo harías en Java:
ScanSpec scanSpec = new ScanSpec()
.withFilterExpression("#idname in (:val1, :val2, :val3)")
.withNameMap(ImmutableMap.of("#idname", "ID"))
.withValueMap(ImmutableMap.of(":val1", "123", ":val2", "456", ":val23", "789"));
ItemCollection = table.scan(scanSpec);
Me imagino que usando el SDK de Javascript sería algo como esto:
var scanParams =
"TableName":"myAwsTable",
"AttributesToGet": ['ID','COMMENTS','DATE'],
"FilterExpression": '#idname in (:val1, :val2, :val3)',
"ExpressionAttributeNames":
'#idname': 'ID'
,
"ExpressionAttributeValues":
':val1': '123',
':val2': '456',
':val3': '789'
Tuve este problema y lo descubrí usando el parámetro contiene
// Object stored in the DB looks like this:
// [
// 'name' => 'myName',
// 'age' => '24',
// 'gender' => 'Male',
// 'visited' => [
// 'countries': ['Canada', 'USA', 'Japan', 'Australia'],
// 'last_trip': '2015/12/13',
// 'reviews_written': 20
// ]
//
// ];
$countries = ['Canada', 'USA', 'Japan', 'Australia'];
$paramToMatch = '24';
$client->query([
'TableName' => 'MyDyanmoDB',
'KeyConditions' => [
'age' => [
'AttributeValueList' => [
$marshaler->marshalValue($paramToMatch)
],
'ComparisonOperator' => 'EQ'
]
],
'ExpressionAttributeNames' => [
'#visited' => 'visited',
'#countries' => 'countries'
],
'ExpressionAttributeValues' => [
':countries' => $marshaler->marshalValue($countries)
],
'FilterExpression' => 'contains(:countries, #visited.#countries)',
]);
Así es como pude usar “escanear” para obtener los elementos con una identificación particular (“ContentID”) en el siguiente ejemplo:
var params =
TableName: environment.ddbContentTableName,
ProjectionExpression: "Title, ContentId, Link",
FilterExpression: "ContentId in (:contentId1, :contentId2, :contentId3, :contentId4)",
ExpressionAttributeValues: ":contentId1":102,":contentId2":104,":contentId3":103,":contentId4":101
;
var docClient = new AWS.DynamoDB.DocumentClient();
docClient.scan(params, onQuery);
Luego puedo construir programáticamente FilterExpression y ExpressionAttributeValues en función de valores conocidos, por ejemplo
// Create the FilterExpression and ExpressionAttributeValues
var filterExpression = "ContentId in (";
var expressionAttributeValues = ;
for (var i = 0; i < currentFavorites.length; i++)
var contentIdName = ":contentId"+(i+1);
if (i==0)
filterExpression = filterExpression + contentIdName;
else
filterExpression = filterExpression + ", " + contentIdName;
expressionAttributeValues[contentIdName] = currentFavorites[i];
filterExpression = filterExpression + ")";
var params =
TableName: environment.ddbContentTableName,
ProjectionExpression: "Title, ContentId, Link",
FilterExpression: filterExpression,
ExpressionAttributeValues: expressionAttributeValues
;
var docClient = new AWS.DynamoDB.DocumentClient();
docClient.scan(params, onQuery);
Calificaciones y comentarios
Si estás de acuerdo, eres capaz de dejar una sección acerca de qué te ha parecido este post.