云数据库MongoDB版对DynamoDB协议提供了支持。本文介绍MongoDB对DynamoDB协议兼容的具体情况。

背景信息

Amazon DynamoDB是一种完全托管的NoSQL数据库服务,提供快速而可预测的性能,能够实现无缝扩展。阿里云数据库MongoDB版现在兼容了DynamoDB协议,您可以在创建MongoDB实例时选择支持DynamoDB协议即可使用DynamoDB协议。如何创建兼容DynamoDB协议的MongoDB实例请参见创建兼容DynamoDB协议的MongoDB实例

注意事项

  • DynamoDB兼容协议仅支持云数据库MongoDB版4.0版本分片集群实例。
  • 存量实例可通过开启兼容DynamoDB协议来获取支持。
  • 目前DynamoDB兼容功能仅支持在VPC环境下使用,使用无需鉴权。

DynamoDB协议支持情况

表 1. DynamoDB接口支持情况
接口名 参数 是否支持 备注
CreateTable 请求参数 必选参数:AttributeDefinitions
必选参数:KeySchema
必选参数:TableName
  • 不能包含以下特殊字符:美元符号 ($)。
  • 不能以system.前缀开头。
  • 长度限制:1~100字节。
可选参数:BillingMode
可选参数:GlobalSecondaryIndexes
可选参数:LocalSecondaryIndexes
可选参数:ProvisionedThroughput
可选参数:SSESpecification
可选参数:StreamSpecification
可选参数:Tags
应答参数 TableDescription
UpdateTable 请求参数 可选参数:AttributeDefinitions
可选参数:BillingMode
必选参数:GlobalSecondaryIndexesUpdates 支持Create和Delete,不支持Update。
可选参数:ProvisionedThroughput
可选参数:ReplicaUpdates
可选参数:SSESpecification
可选参数:StreamSpecification
必选参数:TableName
应答参数 TableDescription 参见TableDescription。
DescribeTable 请求参数 必选参数:TableName
应答参数 Table 参见TableDescription。
ListTables 请求参数 可选参数:ExclusiveStartTableName 不支持分页查询,没有返回记录条数的限制。
可选参数:Limit 不支持分页查询,没有返回记录条数的限制。
应答参数 LastEvaluatedTableName
TableNames
DeleteTable 请求参数 必选参数:TableName
应答参数 TableDescription 参见TableDescription。
PutItem 请求参数 必选参数:Item
必选参数:TableName
可选参数:ConditionalOperator
可选参数:ConditionExpression 参见表达式支持情况
可选参数:Expected
可选参数:ExpressionAttributeNames 参见表达式支持情况
可选参数:ExpressionAttributeValues 参见表达式支持情况
可选参数:ReturnConsumedCapacity
可选参数:ReturnItemCollectionMetrics
可选参数:ReturnValues
应答参数 Attributes
ConsumedCapacity
ItemCollectionMetrics
UpdateItem 请求参数 必选参数:Key
必选参数:TableName
可选参数:AttributeUpdates
可选参数:ConditionalOperator
可选参数:ConditionExpression 参见表达式支持情况
可选参数:Expected
可选参数:ExpressionAttributeNames 参见表达式支持情况
可选参数:ExpressionAttributeValues 参见表达式支持情况
可选参数:ReturnConsumedCapacity
可选参数:ReturnItemCollectionMetrics
可选参数:ReturnValues
可选参数:UpdateExpression 参见表达式支持情况
应答参数 Attributes
ConsumedCapacity
ItemCollectionMetrics
GetItem 请求参数 必选参数:Key
必选参数:TableName
可选参数:AttributesToGet
可选参数:ConsistentRead
可选参数:ExpressionAttributeNames 参见表达式支持情况
可选参数:ProjectionExpression 参见表达式支持情况
可选参数:ReturnConsumedCapacity
应答参数 ConsumedCapacity
Item
DeleteItem 请求参数 必选参数:Key
必选参数:TableName
可选参数:ConditionalOperator
可选参数:ConditionExpression 参见表达式支持情况
可选参数:Expected
可选参数:ExpressionAttributeNames 参见表达式支持情况
可选参数:ExpressionAttributeValues 参见表达式支持情况
可选参数:ReturnConsumedCapacity
可选参数:ReturnItemCollectionMetrics
可选参数:ReturnValues
应答参数 Attributes
ConsumedCapacity
ItemCollectionMetrics
BatchWriteItem 请求参数 必选参数:RequestItems
可选参数:ReturnConsumedCapacity
可选参数:ReturnItemCollectionMetrics
应答参数 ConsumedCapacity
ItemCollectionMetrics
UnprocessedItems
BatchGetItem 请求参数 必选参数:RequestItems Item元素不支持AttributesToGetConsistentRead参数。
可选参数:ReturnConsumedCapacity
应答参数 ConsumedCapacity
Responses
UnprocessedKeys
Query 请求参数 必选参数:TableName
可选参数:AttributesToGet
可选参数:ConditionalOperator
可选参数:ConsistentRead
可选参数:ExclusiveStartKey
可选参数:ExpressionAttributeNames 参见表达式支持情况
可选参数:ExpressionAttributeValues 参见表达式支持情况
可选参数:FilterExpression 参见表达式支持情况
可选参数:IndexName
可选参数:KeyConditionExpression 参见表达式支持情况
可选参数:KeyConditions
可选参数:Limit 不指定时默认按照每101条记录进行分页,而非1MB数据大小。
可选参数:ProjectionExpression 参见表达式支持情况
可选参数:QueryFilter
可选参数:ReturnConsumedCapacity
可选参数:ScanIndexForward
可选参数:Select
应答参数 ConsumedCapacity
Count
Items
LastEvaluatedKey
ScannedCount
Scan 请求参数 必选参数:TableName
可选参数:AttributesToGet
可选参数:ConditionalOperator
可选参数:ConsistentRead
可选参数:ExclusiveStartKey
可选参数:ExpressionAttributeNames 参见表达式支持情况
可选参数:ExpressionAttributeValues 参见表达式支持情况
可选参数:FilterExpression 参见表达式支持情况
可选参数:IndexName
可选参数:Limit 如不指定则默认按照每101条记录进行分页,而不是按照1MB数据大小分页。
可选参数:ProjectionExpression 参见表达式支持情况
可选参数:ReturnConsumedCapacity
可选参数:ScanFilter
可选参数:Segment
可选参数:Select
可选参数:TotalSegments
应答参数 ConsumedCapacity
Count
Items
LastEvaluatedKey
ScannedCount
表 2. DynamoDB接口相关数据结构
数据类型 字段 是否支持
TableDescription ArchivalSummary
AttributeDefinitions
BillingModeSummary
CreationDateTime
GlobalSecondaryIndexes
GlobalTableVersion
ItemCount
KeySchema
LatestStreamArn
LatestStreamLabel
LocalSecondaryIndexes
ProvisionedThroughput
Replicas
RestoreSummary
SSEDescription
StreamSpecification
TableArn
TableId
TableName
TableSizeBytes
TableStatus

表达式支持情况

  • .属性名的处理:一个带.的属性名可能表示一个scalar属性,也可能表示一个嵌入文档。在DynamoDB中的处理规则是:如果在表达式属性名中能够找到该属性名对应的映射,就按照scalar属性进行处理,否则按照嵌入文档进行处理。
    说明 目前暂不支持带.scalar属性的相关处理,如查询、投影等。
  • ProjectionExpression: 只支持一维数组,并且当表达式中只包含数组某个元素时则会返回其他字段。
  • ConditionExpression:
    • DynamoDB中的ConditionExpression语法如下:
      condition-expression ::=
            operand comparator operand
          | operand BETWEEN operand AND operand
          | operand IN ( operand (',' operand (, ...) ))
          | function
          | condition AND condition
          | condition OR condition
          | NOT condition
          | ( condition )
      
      comparator ::=
          =
          | <>
          | <
          | <=
          | >
          | >=
      
      function ::=
          attribute_exists (path)
          | attribute_not_exists (path)
          | attribute_type (path, type)
          | begins_with (path, substr)
          | contains (path, operand)
          | size (path)
    • operand1 comparator operand2语法中,operand1必须为pathoperand2必须为表达式属性值。
    • operand1 BETWEEN operand2 AND operand3语法中,operand1必须为path,其余operand必须为表达式属性值。
    • operand1 IN ( operand2 (',' operand3 (, ...) ))语法中,operand1必须为path,其余operand必须为表达式属性值。
    • 对于function中的size(path)函数,只支持path字段为字符串类型(判断长度)或Set/List类型,用于判断大小,不支持BinaryMap类型。
  • UpdateExpression:
    • DynamoDB中的UpdateExpression语法如下:
      update-expression ::=
          [ SET action [, action] ... ]
          [ REMOVE action [, action] ...]
          [ ADD action [, action] ... ]
          [ DELETE action [, action] ...]
      
      set-action ::=
          path = value
      
      value ::=
          operand
          | operand '+' operand
          | operand '-' operand
      
      operand ::=
          path | function
      
      function ::=
          if_not_exists (path, value)
          | list_append (list1, list2)
      
      remove-action ::=
          path
      
      add-action ::=
          path value
      
      delete-action ::=
          path value
    • set-action:
      • SET path = operand语法中,不支持operandpath的场景。
      • SET path = operand1 '+'|'-' operand2语法中,operand1必须等于path,即在此场景下只支持字段自增或自减。
      • SET path = if_not_exists (path, value)语法中,两个path必须相等,且value只能是表达式属性值。
      • SET path = if_not_exists (path, value)语法中,在同时指定多个时不支持部分更新,即需要满足全部条件才能执行成功。
      • SET path = list_append(list1, list2)语法中,list1list2中必须有一个等于path,另外一个是表达式属性值。
    • remove-action:用于移除List中某个元素时,用null代替被移除的元素,List大小不变,剩下的元素不会发生移位。

最佳实践

您可以将DynamoDB迁移到阿里云数据库MongoDB版,详情请参见使用NimoShake将Amazon DynamoDB迁移至阿里云