首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DynamoDB Swift4复合查询

DynamoDB Swift4复合查询
EN

Stack Overflow用户
提问于 2018-07-16 16:04:35
回答 2查看 213关注 0票数 0

我试图快速地进行一个复杂的查询,以便从DynamoDB获取数据。我可以通过使用userID获取所有信息。但是,有时我可能不知道整个userID,需要进行更复杂的查询。

例如,如果我知道名字和姓氏,并且用户id格式是"firstname:lastname:email",我需要能够查询包括名字和姓氏的所有userID,然后为另一列添加一个where。

我对dynamo非常陌生,我想完成类似下面的sql查询。

SQL示例:

代码语言:javascript
复制
SELECT * FROM mytable
WHERE column2 LIKE '%OtherInformation%'
  AND (column1 LIKE '%lastname%' OR column1 LIKE '%firstname%')

下面是我在swift4中获得userID的代码,如果我知道它是准确的,那么并不完全确定如何为复杂的查询修改它。

代码语言:javascript
复制
func queryDBForUser(Fname: String, Lname: String) {

 let userId = Fname + "." + Lname + ":" + (UIDevice.current.identifierForVendor?.uuidString)!

self.UserId = userId

let objectMapper = AWSDynamoDBObjectMapper.default()

let queryExpression = AWSDynamoDBQueryExpression()

queryExpression.keyConditionExpression = "#userId = :userId"
queryExpression.expressionAttributeNames = ["#userId": "userId",]
queryExpression.expressionAttributeValues = [":userId": userId,]

objectMapper.query(CheckaraUsers.self, expression: queryExpression, completionHandler: {(response: AWSDynamoDBPaginatedOutput? ,error: Error?) -> Void in
    if let error = error {
        print("Amazon DynamoDB Error: \(error)")

        return
    }

我还尝试了许多类似于以下代码的变体,但没有成功:

代码语言:javascript
复制
queryExpression.keyConditionExpression = "#FirstName = :firstName and #LastName = :lastName,"
queryExpression.expressionAttributeNames = ["#FirstName": "FirstName" , "#LastName": "LastName"]
queryExpression.expressionAttributeValues = [":FirstName": Fname,":LastName": Lname]

任何帮助都将不胜感激,谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-17 02:11:52

您将无法使用DynamoDB查询来完成这一任务。在DynamoDB中查询表(或索引)时,必须始终指定完整的主键。在您的例子中,这意味着"firstname:lastname:email“的全部值。

您可以使用DynamoDB扫描和过滤器表达式来实现这一点,但这将查看表中的每一项,因此它可能速度慢、成本高。Amazon将向您收取查看表中每一项所需的阅读容量。

因此,如果您真的想这样做,那么用于扫描操作的筛选表达式应该是如下所示:

代码语言:javascript
复制
"contains (#FirstName, :firstName) and contains (#LastName, : lastName)"

请注意,contains寻找精确的子字符串匹配,因此如果您想要不区分大小写的匹配(如SQL中的ILIKE ),它将无法工作。

如果需要执行这些类型的查询,则需要评估DynamoDB是否适合您。DynamoDB基本上是一个NoSQL密钥/值存储。它将有限的查询功能转换为可伸缩性和性能。如果您是从SQL背景中来到DynamoDB的,并且希望能够对表中的任何内容进行自由格式的查询,那么您将感到失望。

票数 1
EN

Stack Overflow用户

发布于 2018-07-17 20:39:07

通过向我的DynamoDB表添加一个辅助索引来实现查询的工作,尽管这不是我最初想要的,但它仍然工作,因为现在我可以查询我需要的两列中存在的值,而无需在表扫描和过滤之后进行检查。

查询代码:

代码语言:javascript
复制
queryExpression.indexName = "Index-Name" queryExpression.keyConditionExpression = "#LastName = :LastName and #otherValue = :otherValue" 
queryExpression.expressionAttributeNames = ["#LastName": "LastName" , "#otherValue": "otherValue"] 
queryExpression.expressionAttributeValues = [":LastName": Lname,":otherValue": self.otherValue!] 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51365957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档