web-dev-qa-db-fra.com

Comment utiliser l'instruction “IN” dans FilterExpression en utilisant array - dynamodb

Document AWS vérifié, mais aucun exemple de travail trouvé.

Voici ma tentative

var params = {
            TableName: "User",
            IndexName:"a-b-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

            }
          });

J'ai des enregistrements, mais nous recherchons des enregistrements qui ont l'identifiant 1 mais je veux utiliser un tableau comme celui-ci.

 var params = {
        TableName: "User",
        IndexName:"a-b-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

        }
       });

Comment peut rendre le code ci-dessus comme working.want pour obtenir des enregistrements. la syntaxe est correcte et la requête est exécutée sans erreur mais je ne reçois pas d'enregistrements

6
Nirmal Goswami

S'il vous plaît se référer cette répondre

Résumé: -

Pour un nombre fixe de valeurs dans la clause "IN": -

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

Pour plus d'éléments dans un tableau et pour former FilterExpression dynamiquement: -

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
};
15
notionquest

La réponse de notionquest est correcte, mais je ne peux pas utiliser mes autres valeurs dans ExpressionAttributeValues comme :country et :status.

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:"a-b-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

    }
   });
6
Nirmal Goswami

Vous pouvez également utiliser l'approche de notionquest et insérer simplement vos autres valeurs d'attribut dans le titleObject{}. par exemple.

var titleObject = { ": country": "USA", ":status": 1, }; 

Remarque: vous devrez peut-être ajouter un schéma du type "S" si vous n'utilisez pas DocumentClient.

     var titleObject = { 
      ":country": { "S":"USA" }, ...

}
1
adimona

Utilisation de es5 et de la carte:

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()
0
Marcel Panse