你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure Cosmos DB for MongoDB(4.2 服务器版本):支持的功能和语法

适用对象: MongoDB

Azure Cosmos DB 是 Microsoft 提供的全球分布式多模型数据库服务。 Azure Cosmos DB 提供多种数据库 API。 你可以通过任何开源 MongoDB 客户端驱动程序与 Azure Cosmos DB for MongoDB 进行通信。 Azure Cosmos DB for MongoDB 符合 MongoDB 线路协议的要求,因此支持使用现有的客户端驱动程序。

通过使用 Azure Cosmos DB for MongoDB,可以像以往一样从 MongoDB 中受益,并且可使用 Azure Cosmos DB 提供的所有企业功能:全局分发自动分片、可用性和延迟保证、静态加密和备份等。

协议支持

本文已列出支持的运算符以及限制或异常。 任何理解这些协议的客户端驱动程序应该都能够连接到 Azure Cosmos DB for MongoDB。 创建 Azure Cosmos DB for MongoDB 帐户时,3.6+ 版本帐户的终结点采用 *.mongo.cosmos.azure.com 格式。 3.2 版本帐户的终结点采用 *.documents.azure.com 格式。

注意

本文仅列出受支持的服务器命令,并排除客户端包装器函数。 客户端包装器函数(如 deleteMany()updateMany())在内部使用 delete()update() 服务器命令。 使用受支持的服务器命令的函数与 Azure Cosmos DB for MongoDB 兼容。

查询语言支持

Azure Cosmos DB for MongoDB 全面支持 MongoDB 查询语言构造。 可以在以下部分中查找当前支持的操作、运算符、阶段、命令和选项的详细列表。

数据库命令

Azure Cosmos DB for MongoDB 支持以下数据库命令。

查询和写入操作命令

命令 支持
change streams
delete
eval No
find
findAndModify
getLastError
getMore
getPrevError No
insert
parallelCollectionScan
resetError No
update

事务命令

注意

多文档事务仅在单个非分片集合中受支持。 MongoDB 的 API 中尚不支持跨集合和跨分片的多文档事务。

命令 支持
abortTransaction
commitTransaction

身份验证命令

命令 支持
authenticate
getnonce
logout

管理命令

命令 支持
cloneCollectionAsCapped
collMod No
connectionStatus No
convertToCapped No
copydb No
create
createIndexes
currentOp
drop
dropDatabase
dropIndexes
filemd5
killCursors
killOp No
listCollections
listDatabases
listIndexes
reIndex
renameCollection

诊断命令

命令 支持
buildInfo
collStats
connPoolStats
connectionStatus No
dataSize No
dbHash No
dbStats
explain
features No
hostInfo
listDatabases
listCommands
profiler No
serverStatus No
top No
whatsmyuri

聚合管道

Azure Cosmos DB for MongoDB 支持以下聚合命令。

聚合命令

命令 支持
aggregate
count
distinct
mapReduce

聚合阶段

命令 支持
addFields
bucket
bucketAuto No
changeStream
collStats No
count
currentOp No
facet
geoNear
graphLookup No
group
indexStats No
limit
listLocalSessions
listSessions
lookup 部分
match
merge
out
planCacheStats
project
redact
regexFind
regexFindAll
regexMatch
replaceRoot
replaceWith
sample
set
skip
sort
sortByCount
unset
unwind

注意

$lookup 聚合尚不支持服务器版本 3.6 中引入的不相关子查询功能。 如果尝试将 $lookup 运算符与 letpipeline 字段一起使用,则会显示一条错误消息,指出不支持 let

布尔表达式

命令 支持
and
not
or

转换表达式

命令 支持
convert
toBool
toDate
toDecimal
toDouble
toInt
toLong
toObjectId
toString

集表达式

命令 支持
setEquals
setIntersection
setUnion
setDifference
setIsSubset
anyElementTrue
allElementsTrue

比较表达式

注意

用于 MongoDB 的 API 不支持查询中具有数组文本的比较表达式。

Command 支持
cmp
eq
gt
gte
lt
lte
ne
in
nin

算术表达式

命令 支持
abs
add
ceil
divide
exp
floor
ln
log
log10
mod
multiply
pow
round
sqrt
subtract
trunc

三角表达式

命令 支持
acos
acosh
asin
asinh
atan
atan2
atanh
cos
cosh
degreesToRadians
radiansToDegrees
sin
sinh
tan
tanh

字符串表达式

命令 支持
concat
indexOfBytes
indexOfCP
ltrim
rtrim
trim
split
strLenBytes
strLenCP
strcasecmp
substr
substrBytes
substrCP
toLower
toUpper

文本搜索运算符

命令 支持
meta

数组表达式

命令 支持
arrayElemAt
arrayToObject
concatArrays
filter
indexOfArray
isArray
objectToArray
range
reverseArray
reduce
size
slice
zip
in

变量运算符

命令 支持
map
let

系统变量

命令 支持
$$CLUSTERTIME
$$CURRENT
$$DESCEND
$$KEEP
$$NOW
$$PRUNE
$$REMOVE
$$ROOT

文本运算符

命令 支持
literal

日期表达式

命令 支持
dayOfYear
dayOfMonth
dayOfWeek
year
month
week
hour
minute
second
millisecond
dateToString
isoDayOfWeek
isoWeek
dateFromParts
dateToParts
dateFromString
isoWeekYear

条件表达式

命令 支持
cond
ifNull
switch

数据类型运算符

命令 支持
type

累加器表达式

命令 支持
sum
avg
first
last
max
min
push
addToSet
stdDevPop
stdDevSamp

合并运算符

命令 支持
mergeObjects

数据类型

Azure Cosmos DB for MongoDB 支持以 MongoDB BSON 格式编码的文档。 版本 4.0 及更高版本 (4.0+) 扩大了此格式的内部使用来优化性能和降低成本。 这种优化有利于通过运行 4.0+ 的终结点编写或更新的文档。

升级方案中,在升级到 4.0+ 版本之前编写的文档将不从增强的性能中受益,直到其通过 4.0+ 版本的终结点进行写入操作完成更新为止。

16 MB 文档支持将文档的大小限制从 2 MB 提高到 16 MB。 此限制仅适用于启用此功能后创建的集合。 为数据库帐户启用此功能后,将无法再禁用它。

若要启用 16-MB 文档支持,请更改 Azure 门户中资源的“功能”选项卡上的设置,或以编程方式添加 EnableMongo16MBDocumentSupport 功能

建议启用服务器端重试并避免通配符索引,以确保对较大文档的请求成功。 提高数据库或集合请求单位也可能提高性能。

Command 支持
Double
String
Object
Array
Binary Data
ObjectId
Boolean
Date
Null
32-bit Integer (int)
Timestamp
64-bit Integer (long)
MinKey
MaxKey
Decimal128
Regular Expression
JavaScript
JavaScript (with scope)
Undefined

索引和索引属性

Azure Cosmos DB for MongoDB 支持以下索引命令和索引属性。

索引

命令 支持
Single Field Index
Compound Index
Multikey Index
Text Index No
2dsphere
2d Index
Hashed Index

索引属性

命令 支持
TTL
Unique
Partial 仅唯一索引支持
Case Insensitive
Sparse No
Background

运算符

Azure Cosmos DB for MongoDB 支持以下运算符。

逻辑运算符

命令 支持
or
and
not
nor

元素运算符

命令 支持
exists
type

评估查询运算符

命令 支持
expr
jsonSchema No
mod
regex
text 否(不支持。请改用 $regex。)
where

$regex 查询中,左定位表达式允许索引搜索。 但是,使用 i 修饰符(不区分大小写)和 m 修饰符(多行)会导致在所有表达式中进行集合扫描。

当需要包含 $| 时,最好创建两个(或更多)$regex 查询。

例如,更改以下原始查询:

find({x:{$regex: /^abc$/})

更改为以下查询:

find({x:{$regex: /^abc/, x:{$regex:/^abc$/}})

修改后的查询的第一部分使用索引将搜索限制在以 ^abc 开头的文档内。 查询的第二部分与确切的条目匹配。 竖线运算符 (|) 充当“or”函数。 查询 find({x:{$regex: /^abc |^def/}) 匹配字段 x 的值以 abcdef 开头的文档。 要使用索引,建议将查询分解为两个由 $or 运算符连接的不同查询:find( {$or : [{x: $regex: /^abc/}, {$regex: /^def/}] })

数组运算符

命令 支持
all
elemMatch
size

注释运算符

命令 支持
comment

投影运算符

命令 支持
elemMatch
meta No
slice

更新运算符

字段更新运算符

命令 支持
inc
mul
rename
setOnInsert
set
unset
min
max
currentDate

数组更新运算符

命令 支持
$
$[]
$[\<identifier\>]
addToSet
pop
pullAll
pull
push
pushAll

更新修饰符

命令 支持
each
slice
sort
position

位更新运算符

命令 支持
bit
bitsAllSet
bitsAnySet No
bitsAllClear No
bitsAnyClear

地理空间运算符

运算符 支持
$geoWithin
$geoIntersects
$near
$nearSphere
$geometry
$minDistance
$maxDistance
$center
$centerSphere No
$box No
$polygon

排序运算符

使用 findOneAndUpdate 操作时,支持对单个字段执行排序操作。 不支持对多个字段执行排序操作。

索引

API for MongoDB 支持各种索引,以便对多个字段进行排序、提高查询性能并强制实施唯一性。

客户端字段级别加密

客户端级字段加密是一项驱动程序功能,与用于 MongoDB 的 API 兼容。 显式加密,驱动程序在支持写入时显式加密每个字段。 不支持自动加密。 支持显式解密和自动解密。

不应运行 mongocryptd,因为它不需要执行任何受支持的操作。

GridFS

Azure Cosmos DB 通过任何与 GridFS 兼容的 Mongo 驱动程序支持 GridFS。

复制

Azure Cosmos DB 支持在最低层进行自动本机复制。 此逻辑还经过扩展,可实现低延迟和全局复制。 Azure Cosmos DB 不支持手动复制命令。

可重试写入

可重试写入功能使 MongoDB 驱动程序能够自动重试某些写入操作。 该功能导致对某些操作的要求更严格,这符合 MongoDB 协议要求。 启用此功能后,分片集合中的更新操作(包括删除)将需要在查询筛选器或 update 语句中包括分片键。

例如,使用在键 "country" 上分片的分片集合时,若要删除具有字段 "city" = "NYC" 的所有文档,如果启用了可重试写入功能,应用程序将需要对所有分片键 ("country") 值执行操作。

  • db.coll.deleteMany({"country": "USA", "city": "NYC"}) - 成功
  • db.coll.deleteMany({"city": "NYC"}) - 失败并出现错误 ShardKeyNotFound(61)

注意

可重试写入目前不支持批量无序写入。 如果要在启用了可重试写入的情况下执行批量写入,请执行批量有序写入。

若要启用该功能,请向数据库帐户添加 EnableMongoRetryableWrites 功能。 也可通过 Azure 门户中的“功能”选项卡启用此功能。

分片

Azure Cosmos DB 支持服务器端自动分片。 它自动管理分片的创建、放置和均衡。 Azure Cosmos DB 不支持手动分片命令,这意味着你不必调用 addShardbalancerStartmoveChunk 等命令。 只需在创建容器或查询数据时指定分片键。

会话

Azure Cosmos DB 尚不支持服务器端会话命令。

生存时间

Azure Cosmos DB 支持基于文档时间戳的生存时间 (TTL)。 可以为 Azure 门户中的集合启用 TTL。

自定义 TTL

使用此功能可以针对集合中的任一字段设置自定义 TTL。

在已针对某个字段启用 TTL 的集合上:

  • 可接受的类型为 BSON 数据类型和数字类型(整数、长整数、双精度数),它们将解释为 Unix 毫秒时间戳以确定过期时间。

  • 如果 TTL 字段是一个数组,则可接受类型的数组的最小元素被视为文档过期时间。

  • 如果文档中缺少 TTL 字段,则该文档不会过期。

  • 如果 TTL 字段不是可接受的类型,则文档不会过期。

自定义 TTL 的限制

  • 只能为集合中的一个字段设置 TTL。

  • 设置自定义 TTL 字段后,\_ts 字段不可用于设置文档过期时间。

  • 此外,不能使用 \_ts 字段。

配置

可以通过更新帐户的 EnableTtlOnCustomPath 功能来启用自定义 TTL。 了解如何配置功能

设置 TTL

若要设置 TTL,请运行以下命令:db.coll.createIndex({"YOUR_CUSTOM_TTL_FIELD":1}, {expireAfterSeconds: 10})

事务

未分片集合支持多文档事务。 不支持跨集合或分片集合的多文档事务。 事务超时固定为 5 秒。

管理用户和角色

Azure Cosmos DB 尚不支持用户和角色。 不过,Azure Cosmos DB 支持 Azure 基于角色的访问控制 (Azure RBAC) 以及读写和只读密码与密钥 - 可通过 Azure 门户(在“连接字符串”页上)获取这些内容。

写关注

某些应用程序依赖写关注,后者指定写入操作期间需要的响应数。 考虑到 Azure Cosmos DB 在后台处理复制的方式,所有写入在默认情况下都自动成为仲裁。 由客户端代码指定的任何写关注都会被系统忽略。 了解如何使用一致性级别最大化可用性和性能

后续步骤