我试图快速地进行一个复杂的查询,以便从DynamoDB获取数据。我可以通过使用userID获取所有信息。但是,有时我可能不知道整个userID,需要进行更复杂的查询。
例如,如果我知道名字和姓氏,并且用户id格式是"firstname:lastname:email",我需要能够查询包括名字和姓氏的所有userID,然后为另一列添加一个where。
我对dynamo非常陌生,我想完成类似下面的sql查询。
SQL示例:
SELECT * FROM mytable
WHERE column2 LIKE '%OtherInformation%'
AND (column1 LIKE '%lastname%' OR column1 LIKE '%firstname%')下面是我在swift4中获得userID的代码,如果我知道它是准确的,那么并不完全确定如何为复杂的查询修改它。
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
}我还尝试了许多类似于以下代码的变体,但没有成功:
queryExpression.keyConditionExpression = "#FirstName = :firstName and #LastName = :lastName,"
queryExpression.expressionAttributeNames = ["#FirstName": "FirstName" , "#LastName": "LastName"]
queryExpression.expressionAttributeValues = [":FirstName": Fname,":LastName": Lname]任何帮助都将不胜感激,谢谢!
发布于 2018-07-17 02:11:52
您将无法使用DynamoDB查询来完成这一任务。在DynamoDB中查询表(或索引)时,必须始终指定完整的主键。在您的例子中,这意味着"firstname:lastname:email“的全部值。
您可以使用DynamoDB扫描和过滤器表达式来实现这一点,但这将查看表中的每一项,因此它可能速度慢、成本高。Amazon将向您收取查看表中每一项所需的阅读容量。
因此,如果您真的想这样做,那么用于扫描操作的筛选表达式应该是如下所示:
"contains (#FirstName, :firstName) and contains (#LastName, : lastName)"请注意,contains寻找精确的子字符串匹配,因此如果您想要不区分大小写的匹配(如SQL中的ILIKE ),它将无法工作。
如果需要执行这些类型的查询,则需要评估DynamoDB是否适合您。DynamoDB基本上是一个NoSQL密钥/值存储。它将有限的查询功能转换为可伸缩性和性能。如果您是从SQL背景中来到DynamoDB的,并且希望能够对表中的任何内容进行自由格式的查询,那么您将感到失望。
发布于 2018-07-17 20:39:07
通过向我的DynamoDB表添加一个辅助索引来实现查询的工作,尽管这不是我最初想要的,但它仍然工作,因为现在我可以查询我需要的两列中存在的值,而无需在表扫描和过滤之后进行检查。
查询代码:
queryExpression.indexName = "Index-Name" queryExpression.keyConditionExpression = "#LastName = :LastName and #otherValue = :otherValue"
queryExpression.expressionAttributeNames = ["#LastName": "LastName" , "#otherValue": "otherValue"]
queryExpression.expressionAttributeValues = [":LastName": Lname,":otherValue": self.otherValue!] https://stackoverflow.com/questions/51365957
复制相似问题