DynamoDB使用包含操作符进行查询

9

我的表格项的形式为

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");
});

我正在运行这段代码:
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)

    }
});

我遇到了这个错误:

"在KeyConditionExpression中使用了无效的操作符:contains"

有什么想法吗?

2个回答

29

这里有几个需要澄清的事情。

1)DynamoDB的关键属性必须是标量数据类型。因此,我认为属性genres不能定义为SET或LIST数据类型。

2)KeyConditionExpression - 只能引用哈希和排序键。因此,我推断属性genres被定义为表的SORT键。

3)contains可以用于字符串、SET或LIST数据类型的FilterExpression中。它不能用于KeyConditionExpression

结论 - 直接回答请参考第3点


有没有想过如何在文本中进行搜索?比如子字符串搜索?例如:在“蓝屏错误”中搜索“蓝色”。 - sid8491
1
@sid8491 你可以使用CONTAINS。请注意,这是一个区分大小写的匹配。FilterExpression: "contains (title, :titleVal)", ExpressionAttributeValues: { ":titleVal": "somevalue" } - notionquest
但我想匹配的字段是“字符串”字段,而您提到它只能用于SET或LIST类型。 - sid8491
1
@sid8491 它也可以用于字符串。 - notionquest
9
这个例子表明 contains 可以用在 KeyConditionExpression 上吗?(参考链接为:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SQLtoNoSQL.ReadData.Query.html) - MK Yung
2
@MKYung 我现在也完全迷惑了。官方文档明确显示“contains”可以在KeyConditionExpression中使用。 - Vingtoft

0
根据SDK文档,KeyConditionExpression支持以下表达式:
a = b — 如果属性a等于值b,则为true a < b — 如果a小于b,则为true a <= b — 如果a小于或等于b,则为true a > b — 如果a大于b,则为true a >= b — 如果a大于或等于b,则为true a BETWEEN b AND c — 如果a大于或等于b,并且小于或等于c,则为true。
还支持以下函数:
begins_with (a, substr) — 如果属性a的值以特定的子字符串开头,则为true。
请参阅文档页面: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接