Amazon dynamodb 使用beginsWith使用dynamoose.get在排序键中搜索

Amazon dynamodb 使用beginsWith使用dynamoose.get在排序键中搜索,amazon-dynamodb,dynamoose,Amazon Dynamodb,Dynamoose,我在这里开始学习Dynamodb,目前正在尝试在我的表上进行搜索,其中PK是分区键,SK是范围键。PK包含一个电子邮件地址,而SK包含的值类似于AB\u STATE,BC\u STATE,MY\u STATE。因此,我想在SK中搜索,其中值以MY\ucode>开头,但我不完全确定如何使用.get()函数进行搜索 这是我的查询Seller.get({“PK”:”imin@cats.com“,“SK”:“MY”})这显然不是我想要的 我知道我可能可以像下面这样使用过滤器,但我在很多地方看到不推荐使用

我在这里开始学习Dynamodb,目前正在尝试在我的表上进行搜索,其中PK是分区键,SK是范围键。PK包含一个电子邮件地址,而SK包含的值类似于
AB\u STATE
BC\u STATE
MY\u STATE
。因此,我想在SK中搜索,其中值以
MY\ucode>开头,但我不完全确定如何使用
.get()
函数进行搜索

这是我的查询
Seller.get({“PK”:”imin@cats.com“,“SK”:“MY”})
这显然不是我想要的

我知道我可能可以像下面这样使用过滤器,但我在很多地方看到不推荐使用过滤器(?)

下面是我的卖家表的模式

const schema = new dynamoose.Schema({
    PK: {
        type: String,   
        hashKey: true,
    },
    SK: {
        type: String,   
        rangeKey: true,
    },
    "firstName": String,
    "lastName": String,
    "gender": {
        "type": Number,
        "default": 0
    },
}, {
    "saveUnknown": true,
    "timestamps": true
});

在执行
Model.get
调用时,必须传入整个密钥。不能传入以开头的密钥。这是因为
Model.get
只返回一个项目,并且查询表明您可以在那里有多个项目

很难准确回答您的问题,因为您没有发布您的模式。但是在这种情况下执行
查询
看起来不错,因为您是在查询数据,而不是过滤数据


基于评论的更多信息

我意识到这本书并没有像它应该的那样涵盖这一点。基本上取决于您的模式,它将确定最佳索引,并以它知道的最佳方式对其进行优化

例如,如果您有以下代码:

const dynamoose=require(“dynamoose”);
(异步()=>{
dynamoose.model.defaults.set({
“创建”:错误,
“waitForActive”:false
});
const schema=new dynamoose.schema({
“主键”:{
“类型”:字符串,
“hashKey”:true
},
“SK”:{
“类型”:字符串,
“rangeKey”:正确
}
});
const Model=dynamoose.Model(“用户”,模式);
dynamoose.logger.providers.add(控制台);
const filter=新的dynamoose.Condition()。其中(“PK”).eq(“test@test.com)过滤(“SK”)。以(“我的”)开头;
const premiseProfile=await Model.query(filter.exec())
})();
它将产生以下输出:

aws:dynamodb:query:request - {
    "ExpressionAttributeNames": {
        "#qha": "PK",
        "#qra": "SK"
    },
    "ExpressionAttributeValues": {
        ":qhv": {
            "S": "test@test.com"
        },
        ":qrv": {
            "S": "MY_"
        }
    },
    "TableName": "User",
    "KeyConditionExpression": "#qha = :qhv AND begins_with (#qra, :qrv)"
}
正如您所见,它使用的是
KeyConditionExpression
,而不是
filtereexpression

所以你没有过滤。如果对您更有意义,您可以使用
condition.where
condition.attribute


需要注意的是,在某些情况下,它将使用
filtereexpression
。但它会首先查看您的模式,并尝试查看它是否可以使用
KeyConditionExpression
,如果可以,它会使用它,否则它将使用
filtereexpression

哎哟,真不敢相信我错过了
Model.get
只返回文档中的一项。看来我只能用
查询
。关于你最后的陈述,你为什么这么说?我的意思是,既然我在我的
查询中使用了
过滤器
,那不是意味着我在做过滤吗?@imin刚刚更新了我的答案来解决这个问题。哇,非常感谢charlie,你的答案真的很有信息量,特别是对于像我这样刚刚开始使用DynamoDB和Dynamoose的人。再次感谢!!哦,是的,还有一件事,因为正如你提到的,文档没有涵盖condition.filter。非常好,我可以知道你是如何知道查询将产生你上面写的输出
aws:dynamodb:query:request…
?我查看了您在上面提供的condition.filter文档页面,但找不到该页面,其中提到了事件背后的真实情况scene@imin
dynamoose.logger.providers.add(控制台)行生成该输出。大多数用于处理的代码都是。基本上,因为您没有使用索引,所以它对hashKey使用
KeyConditionExpression
,也可以选择使用rangeKey(如果您也在查询)。
aws:dynamodb:query:request - {
    "ExpressionAttributeNames": {
        "#qha": "PK",
        "#qra": "SK"
    },
    "ExpressionAttributeValues": {
        ":qhv": {
            "S": "test@test.com"
        },
        ":qrv": {
            "S": "MY_"
        }
    },
    "TableName": "User",
    "KeyConditionExpression": "#qha = :qhv AND begins_with (#qra, :qrv)"
}