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

背景信息

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

注意事项

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

DynamoDB协议支持情况

表 1. DynamoDB接口支持情况
接口名 参数 是否支持 备注
CreateTable 请求参数 必选参数:AttributeDefinitions
必选参数:KeySchema
必选参数:TableName
  • 不能包含以下特殊字符:美元符号 ($)。
  • 不能以system.前缀开头。
  • 长度限制:1~100字节。
可选参数:BillingMode
可选参数:GlobalSecondaryIndexes
可选参数:LocalSecondaryIndexes
可选参数:ProvisionedThroughput
可选参数:SSESpecification
可选参数:StreamSpecification StreamViewType参数当前仅支持如下值:
  • KEYS_ONLY
    说明 KEYS_ONLY当前仅支持包含分区键(Partition key),不支持表中存在排序键(Sort key)。
  • NEW_IMAGE
可选参数:Tags
返回参数 TableDescription
UpdateTable 请求参数 可选参数:AttributeDefinitions
可选参数:BillingMode
必选参数:GlobalSecondaryIndexesUpdates 支持Create和Delete,不支持Update。
可选参数:ProvisionedThroughput
可选参数:ReplicaUpdates
可选参数:SSESpecification
可选参数:StreamSpecification StreamViewType参数当前仅支持如下值:
  • KEYS_ONLY
    说明 KEYS_ONLY当前仅支持包含分区键(Partition key),不支持表中存在排序键(Sort key)。
  • NEW_IMAGE
必选参数: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
可选参数:ProjectionExpression 参见表达式支持情况
可选参数:QueryFilter
可选参数:ReturnConsumedCapacity
可选参数:ScanIndexForward
可选参数:Select
返回参数 ConsumedCapacity
Count
Items
LastEvaluatedKey
ScannedCount
Scan 请求参数 必选参数:TableName
可选参数:AttributesToGet
可选参数:ConditionalOperator
可选参数:ConsistentRead
可选参数:ExclusiveStartKey
可选参数:ExpressionAttributeNames 参见表达式支持情况
可选参数:ExpressionAttributeValues 参见表达式支持情况
可选参数:FilterExpression 参见表达式支持情况
可选参数:IndexName
可选参数:Limit
可选参数:ProjectionExpression 参见表达式支持情况
可选参数:ReturnConsumedCapacity
可选参数:ScanFilter
可选参数:Segment
可选参数:Select
可选参数:TotalSegments
返回参数 ConsumedCapacity
Count
Items
LastEvaluatedKey
ScannedCount
表 2. DynamoDBStreams接口支持情况
接口名 参数 是否支持 备注
DescribeStream 请求参数 必选参数:StreamArn
可选参数:Limit
可选参数:ExclusiveStartShardId
返回参数 必选参数:StreamDescription 对比AWS DynamoDB实例,该返回参数返回结果有如下区别:
  • StartingSequenceNumber字段固定为unknown
  • EndingSequenceNumber字段以时间戳体现。
  • 由于DynamoDB协议兼容版实例仅有一个Shard,ShardId字段固定为arn:alibaba:mongo-dynamodb@shard-only-1
ListStreams 请求参数 可选参数:TableName
可选参数:Limit
可选参数:ExclusiveStartStreamArn
返回参数 必选参数:Streams 每个表中最多只能返回一个Stream。
GetShardIterator 请求参数 必选参数:StreamArn
必选参数:ShardId 由于DynamoDB协议兼容版实例仅有一个Shard,本字段固定为arn:alibaba:mongo-dynamodb@shard-only-1
必选参数:ShardIteratorType 当前仅支持传入LATESTAFTER_SEQUENCE_NUMBER
可选参数:SequenceNumber ShardIteratorTypeAFTER_SEQUENCE_NUMBER时使用,可传入32位秒级时间戳。
返回参数 必选参数:ShardIterator
GetRecords 请求参数 必选参数:ShardIterator
可选参数:Limit 不指定时默认按照每101条记录进行分页,而非1MB数据大小。
返回参数 必选参数:Records
表 3. 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的不同,因此,阿里云会在DynamoDB协议兼容版以及MongoDB的数据类型之间做映射,使二者相互兼容彼此的数据类型。

数据类型映射关系表:
DynamoDB数据类型 MongoDB数据类型
B Binary data
BOOL Boolean
BS *
L Array
M Object
N Double
NS *
NULL Null
S String
SS *
说明 DynamoDB中的BS(binary set)、NS(number set)、SS(string set)数据类型不允许重复数据。例如,在NS中插入 1,2,2,3,NS会对数据做去重操作,最终结果会变成 1,2,3。而DynamoDB协议兼容版当前暂不支持对这三种数据类型进行去重,因此上面表格中标记为星号(*)的部分都将作为数组(Array)进行处理。阿里云会在后续版本中对这三种数据类型进行优化以支持去重。

最佳实践

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