Amazon dynamodb 使用beginsWith使用dynamoose.get在排序键中搜索
我在这里开始学习Dynamodb,目前正在尝试在我的表上进行搜索,其中PK是分区键,SK是范围键。PK包含一个电子邮件地址,而SK包含的值类似于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”})这显然不是我想要的 我知道我可能可以像下面这样使用过滤器,但我在很多地方看到不推荐使用
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@imindynamoose.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)"
}