Dynamo db query using contains operator

16,427

There are few things that need to be clarified here.

1) The Key attributes of DynamoDB has to be scalar data type. So, I believe the attribute genres can't be defined as SET or LIST data type

2) KeyConditionExpression - can refer to Hash and Sort key only. So, I presume the attribute genres is defined as SORT key of the table

3) contains can be used on FilterExpression on data types STRING, SET or LIST. It can't be used on KeyConditionExpression

Conclusion - Refer point 3 for straight forward answer

Share:
16,427
Amir Gur
Author by

Amir Gur

Updated on June 22, 2022

Comments

  • Amir Gur
    Amir Gur almost 2 years

    My table items are of the form of

    function addDoc(movie,cb){
        var params = {
            TableName: "Movies",
            Item: {
                "year":  movie.year,
                "title": movie.title,
                "info":  movie.info,
                "genres" : movie.info.genres || []
            }
        };
        docClient.put(params, function(err, data) {
            bar.tick(1)
            i++;
            cb(err);
        });
    }
    
    async.eachLimit(allMovies,50,addDoc,function (err) {
        console.log(err)
        console.log("done inserting " + i + " movies");
    });
    

    I'm running this code :

    var params = {
        TableName : "Movies",
        //ProjectionExpression:"#yr, title, genres, info.actors[0]",
        KeyConditionExpression: "#yr = :yyyy and contains(genres, :g1)",
        ExpressionAttributeNames:{
            "#yr": "year"
        },
        ExpressionAttributeValues: {
            ":yyyy":1992,
            ":g1" : "Drama"
        },
        //Select : "COUNT"
    };
    var start = Date.now()
    docClient.query(params, function(err, data) {
        if (err) {
            console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
        } else {
            console.log("time elapsed :",Date.now()-start);
            console.log("Query succeeded.");
    
            console.log(data)
    
        }
    });
    

    and I'm getting this error

    "Invalid operator used in KeyConditionExpression: contains"

    any idea?