使用 Azure Cosmos DB for MongoDB 7.0,可以将熟悉的 MongoDB 功能与企业级功能(例如多区域分发、自动分片和高可用性)配合使用。 本文介绍使用 Azure Cosmos DB for MongoDB 7.0 时支持的功能、语法和优势。
协议支持
本文已列出支持的运算符以及限制或异常。 任何理解这些协议的客户端驱动程序应该都能够连接到 Azure Cosmos DB for MongoDB。 创建 Azure Cosmos DB for MongoDB 帐户时,3.6+ 版本帐户的终结点采用 *.mongo.cosmos.azure.cn
格式。 3.2 版本帐户的终结点采用 *.documents.azure.cn
格式。
注意
本文仅列出受支持的服务器命令,并排除客户端包装器函数。 客户端包装器函数(如 deleteMany()
和 updateMany()
)在内部使用 delete()
和 update()
服务器命令。 使用受支持的服务器命令的函数与 Azure Cosmos DB for MongoDB 兼容。
查询语言支持
Azure Cosmos DB for MongoDB 全面支持 MongoDB 查询语言构造。 可以在以下部分中查找当前支持的操作、运算符、阶段、命令和选项的详细列表。
数据库命令
Azure Cosmos DB for MongoDB 支持以下数据库命令。
查询和写入操作命令
支持 | |
---|---|
change streams |
✅ 是 |
delete |
✅ 是 |
eval |
✖️ 不 |
find |
✅ 是 |
findAndModify |
✅ 是 |
getLastError |
✅ 是 |
getMore |
✅ 是 |
getPrevError |
✖️ 不 |
insert |
✅ 是 |
parallelCollectionScan |
✖️ 不 |
resetError |
✖️ 不 |
update |
✅ 是 |
事务命令
注意
多文档事务仅在单个非分片集合中受支持。 MongoDB API 尚不支持跨集合和跨分片多文档事务。
支持 | |
---|---|
abortTransaction |
✅ 是 |
commitTransaction |
✅ 是 |
身份验证命令
支持 | |
---|---|
authenticate |
✅ 是 |
getnonce |
✅ 是 |
logout |
✅ 是 |
管理命令
支持 | |
---|---|
cloneCollectionAsCapped |
✖️ 不 |
collMod |
✖️ 不 |
connectionStatus |
✖️ 不 |
convertToCapped |
✖️ 不 |
copydb |
✖️ 不 |
create |
✅ 是 |
createIndexes |
✅ 是 |
currentOp |
✅ 是 |
drop |
✅ 是 |
dropDatabase |
✅ 是 |
dropIndexes |
✅ 是 |
filemd5 |
✅ 是 |
killCursors |
✅ 是 |
killOp |
✖️ 不 |
listCollections |
✅ 是 |
listDatabases |
✅ 是 |
listIndexes |
✅ 是 |
reIndex |
✅ 是 |
renameCollection |
✖️ 不 |
诊断命令
支持 | |
---|---|
buildInfo |
✅ 是 |
collStats |
✅ 是 |
connPoolStats |
✖️ 不 |
connectionStatus |
✖️ 不 |
dataSize |
✖️ 不 |
dbHash |
✖️ 不 |
dbStats |
✅ 是 |
explain |
✅ 是 |
features |
✖️ 不 |
hello |
✅ 是 |
hostInfo |
✅ 是 |
listDatabases |
✅ 是 |
listCommands |
✖️ 不 |
profiler |
✖️ 不 |
serverStatus |
✖️ 不 |
top |
✖️ 不 |
whatsmyuri |
✅ 是 |
聚合管道
Azure Cosmos DB for MongoDB 支持以下聚合命令。
聚合命令
支持 | |
---|---|
aggregate |
✅ 是 |
count |
✅ 是 |
distinct |
✅ 是 |
mapReduce |
✖️ 不 |
聚合阶段
支持 | |
---|---|
addFields |
✅ 是 |
bucket |
✖️ 不 |
bucketAuto |
✖️ 不 |
changeStream |
✅ 是 |
collStats |
✖️ 不 |
count |
✅ 是 |
currentOp |
✖️ 不 |
facet |
✅ 是 |
geoNear |
✅ 是 |
graphLookup |
✖️ 不 |
group |
✅ 是 |
indexStats |
✖️ 不 |
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
运算符与字段结合使用let
pipeline
会导致一条错误消息,指示“let
不支持”。
布尔表达式
支持 | |
---|---|
and |
✅ 是 |
not |
✅ 是 |
or |
✅ 是 |
转换表达式
支持 | |
---|---|
convert |
✅ 是 |
toBool |
✅ 是 |
toDate |
✅ 是 |
toDecimal |
✅ 是 |
toDouble |
✅ 是 |
toInt |
✅ 是 |
toLong |
✅ 是 |
toObjectId |
✅ 是 |
toString |
✅ 是 |
集表达式
支持 | |
---|---|
setEquals |
✅ 是 |
setIntersection |
✅ 是 |
setUnion |
✅ 是 |
setDifference |
✅ 是 |
setIsSubset |
✅ 是 |
anyElementTrue |
✅ 是 |
allElementsTrue |
✅ 是 |
比较表达式
注意
API for MongoDB 不支持查询中具有数组文本的比较表达式。
支持 | |
---|---|
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 二进制 JSON (BSON) 格式编码的文档。 版本 4.0 及更高版本 (4.0+) 扩大了此格式的内部使用来优化性能和降低成本。 这种优化有利于通过运行 4.0+ 的终结点编写或更新的文档。
在 升级到版本 4.0 或更高版本的升级方案中,在升级之前创建的文档不会立即受益于增强的性能。 如需利用这些改进,请通过 4.0 终结点进行写操作来更新这些文档。
16 MB 的文档支持将文档的大小限制从 2 MB 提高到 16 MB。 此限制仅适用于启用该功能后创建的集合。 为数据库帐户启用此功能后,无法禁用此功能。
若要启用 16-MB 文档支持,请更改 Azure 门户中资源的“功能”选项卡上的设置,或以编程方式。
建议启用服务器端重试并避免通配符索引,以确保对较大文档的请求成功。 提高数据库或集合请求单位也可能提高性能。
支持 | |
---|---|
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 |
✖️ 不 |
2dsphere |
✅ 是 |
2d Index |
✖️ 不 |
Hashed Index |
✖️ 不 |
索引属性
支持 | |
---|---|
TTL |
✅ 是 |
Unique |
✅ 是 |
Partial |
❓部分 |
Case Insensitive |
✖️ 不 |
Sparse |
✖️ 不 |
Background |
✅ 是 |
小窍门
Partial
仅适用于唯一索引。
运算符
Azure Cosmos DB for MongoDB 支持以下运算符。
逻辑运算符
支持 | |
---|---|
or |
✅ 是 |
and |
✅ 是 |
not |
✅ 是 |
nor |
✅ 是 |
元素运算符
支持 | |
---|---|
exists |
✅ 是 |
type |
✅ 是 |
评估查询运算符
支持 | |
---|---|
expr |
✅ 是 |
jsonSchema |
✖️ 不 |
mod |
✅ 是 |
regex |
✅ 是 |
text |
✖️ 不 |
where |
✖️ 不 |
在 $regex
查询中,左定位表达式允许索引搜索。 但是,使用 i
修饰符(不区分大小写)和 m
修饰符(多行)会导致在所有表达式中进行集合扫描。
当需要包含 $
或 |
时,最好创建两个(或更多)$regex
查询。
例如,更改以下原始查询:
find({x:{$regex: /^abc$/})
更改为以下查询:
find({x:{$regex: /^abc/, x:{$regex:/^abc$/}})
修改后的查询的第一部分使用索引将搜索限制在以 ^abc
开头的文档内。 查询的第二部分与确切的条目匹配。 条形运算符 (|
) 充当函数 or
。 查询 find({x:{$regex: /^abc |^def/})
匹配字段 x
的值以 abc
或 def
开头的文档。 若要使用索引,可将查询分解为两个单独的查询,并将其与运算符联接$or
: find({$or: [{x: {$regex: /^abc/}}, {x: {$regex: /^def/}}]})
小窍门
不支持该 text
命令。 请改用 $regex
。
数组运算符
支持 | |
---|---|
all |
✅ 是 |
elemMatch |
✅ 是 |
size |
✅ 是 |
注释运算符
支持 | |
---|---|
comment |
✅ 是 |
投影运算符
支持 | |
---|---|
elemMatch |
✅ 是 |
meta |
✖️ 不 |
slice |
✅ 是 |
更新运算符
字段更新运算符
支持 | |
---|---|
inc |
✅ 是 |
mul |
✅ 是 |
rename |
✅ 是 |
setOnInsert |
✅ 是 |
set |
✅ 是 |
unset |
✅ 是 |
min |
✅ 是 |
max |
✅ 是 |
currentDate |
✅ 是 |
数组更新运算符
支持 | |
---|---|
$ |
✅ 是 |
$[] |
✅ 是 |
$[\<identifier\>] |
✅ 是 |
addToSet |
✅ 是 |
pop |
✅ 是 |
pullAll |
✅ 是 |
pull |
✅ 是 |
push |
✅ 是 |
pushAll |
✅ 是 |
更新修饰符
支持 | |
---|---|
each |
✅ 是 |
slice |
✅ 是 |
sort |
✅ 是 |
position |
✅ 是 |
位更新运算符
支持 | |
---|---|
bit |
✅ 是 |
bitsAllSet |
✖️ 不 |
bitsAnySet |
✖️ 不 |
bitsAllClear |
✖️ 不 |
bitsAnyClear |
✖️ 不 |
地理空间运算符
支持 | |
---|---|
$geoWithin |
✅ 是 |
$geoIntersects |
✅ 是 |
$near |
✅ 是 |
$nearSphere |
✅ 是 |
$geometry |
✅ 是 |
$minDistance |
✅ 是 |
$maxDistance |
✅ 是 |
$center |
✖️ 不 |
$centerSphere |
✖️ 不 |
$box |
✖️ 不 |
$polygon |
✖️ 不 |
排序运算符
使用 findOneAndUpdate
操作时,支持对单个字段执行排序操作。 不支持对多个字段执行排序操作。
索引
API for MongoDB 支持各种索引,以便对多个字段进行排序、提高查询性能并强制实施唯一性。
客户端字段级别加密
客户端级字段加密是一项驱动程序功能,适用于 Azure Cosmos DB for MongoDB。 支持显式加密,其中驱动程序在写入作期间对每个字段进行加密。 不支持自动加密。 支持显式解密和自动解密。
不应运行 mongocryptd
,因为它不需要执行任何受支持的操作。
GridFS
Azure Cosmos DB 通过任何与 GridFS 兼容的 Mongo 驱动程序支持 GridFS。
复制
Azure Cosmos DB 支持在最低层进行自动本机复制。 此逻辑还可以扩展,实现低延迟的多区域复制。 Azure Cosmos DB 不支持手动复制命令。
可重试写入
可重试写入功能使 MongoDB 驱动程序能够自动重试某些写入操作。 该功能导致对某些操作的要求更严格,这符合 MongoDB 协议要求。 启用此功能后,分片集合中的更新操作(包括删除)将需要在查询筛选器或 update 语句中包括分片键。
例如,使用分片集合,对键 region
进行分片:若要删除具有字段 city = "NYC"
的所有文档,如果启用了可重试写入,应用程序需要对所有区域分片键(region)的值执行操作。
-
db.coll.deleteMany({"region": "USA", "city": "NYC"})
- 消息成功Success
-
db.coll.deleteMany({"city": "NYC"})
- 失败并出现错误ShardKeyNotFound(61)
注意
可重试写入功能目前不支持批量无序写入。 如果要在启用了可重试写入的情况下执行批量写入,请执行批量有序写入。
若要启用该功能,请向数据库帐户添加 EnableMongoRetryableWrites 功能。 也可通过 Azure 门户中的“功能”选项卡启用此功能。
分片
Azure Cosmos DB 支持服务器端自动分片。 它自动管理分片的创建、放置和均衡。 Azure Cosmos DB 不支持手动分片命令,这意味着你不必调用 addShard
、balancerStart
、moveChunk
等命令。 只需在创建容器或查询数据时指定分片键。
会话
Azure Cosmos DB 尚不支持服务器端会话命令。
生存时间
Azure Cosmos DB 提供一种基于文档时间戳的生存时间(TTL)机制。 在 Azure 门户中为集合启用 TTL。
自定义 TTL
此功能允许你在集合中的单个字段上指定自定义 TTL 值。 文档根据此字段的值过期。
在已针对某个字段启用 TTL 的集合上:
可接受的类型是二进制 JSON(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 门户 (在 连接字符串 页上)获取。
写关注
某些应用程序依赖写关注,后者指定写入操作期间需要的响应数。 考虑到 Azure Cosmos DB 在后台处理复制的方式,所有写入在默认情况下都自动成为仲裁。 Azure Cosmos DB 忽略客户端代码指定的任何写入问题。 了解如何使用一致性级别最大化可用性和性能。