Amir Gur
Amir Gur

Reputation: 117

Dynamo db query using contains operator

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?

Upvotes: 9

Views: 27108

Answers (2)

Armen Babakanian
Armen Babakanian

Reputation: 2305

Based on the SDK documentation, KeyConditionExpression supports the following expressions:

a = b — true if the attribute a is equal to the value b

a < b — true if a is less than b

a <= b — true if a is less than or equal to b

a > b — true if a is greater than b

a >= b — true if a is greater than or equal to b

a BETWEEN b AND c — true if a is greater than or equal to b, and less than or equal to c.

The following function is also supported:

begins_with (a, substr)— true if the value of attribute a begins with a particular substring.

see documentation page: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.html

Upvotes: 0

notionquest
notionquest

Reputation: 39186

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

Upvotes: 30

Related Questions