胖头鱼的鱼缸

这款国产数据库也能替掉MongoDB

胖头鱼的技术专栏-452 这款国产数据库也能替掉MongoDB(20260727)

作者:胖头鱼的鱼缸(尹海文)
Oracle ACE Pro: Database
PostgreSQL ACE

10 年 + 数据库行业经验
拥有 OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP 等认证
墨天轮 MVP,ITPUB 认证专家
圈内拥有“总监”称号,非著名社恐(社交恐怖分子)

全网同名:胖头鱼的鱼缸
ITPUB:yhw1809
除授权转载并标明出处外,均为“非法”抄袭
914fcc7ad57defa7868c3be1ca7fb4f5.jpg

这个月才测完了金仓数据库的MySQL兼容模式,这几天麦麦又告诉我他们的KingbaseES V9(文档版)也开始内测了,并直接发来了内测软件包和相关材料。作为OPC(无业游民)的我,自然继续担起了摸索语法兼容性的重任。

本次测试环境和之前一样2C8G,100GB磁盘的RHEL 8.10虚拟机上,数据库的配置与安装过程省略。

1 版本介绍

KingbaseES作为一款支持多模的数据库产品,在传统关系型数据库的同时,也支持NoSQL数据库,而MongoDB作为NoSQL数据库的代表,KingbaseES同样对其进行了兼容。

1.1 产品定位

KingbaseES V9(文档版)实现了协议级兼容MongoDB,可以直接使用MongoDB的客户端(mongosh、MongoDB Compass)或其他语言驱动程序进行连接,无需修改应用代码即可完成从MongoDB到KingbaseES的迁移。

项目
说明
产品名称
金仓数据库管理系统 V9(文档版)
版本号
V009R200C013B001PS002
兼容目标
MongoDB 5.0+
兼容层级
协议级兼容(BSON 协议)
数据库模式
PG 模式(安装时选择)
字符集
UTF8

1.2 核心架构

KingbaseES文档版通过documentdb 插件提供MongoDB兼容能力。该插件在KingbaseES关系型存储引擎之上实现了BSON文档存储、MongoDB查询协议和全套MongoDB命令接口。
3ea506849cdb406789a9d3e047dcb4ff.png

1.3 功能概览

功能类别
支持情况
说明
BSON 数据类型
✅ 全支持
字符串、数值、布尔、日期、ObjectId、内嵌文档、数组、二进制、正则等
CRUD 操作
✅ 全支持
insertOne/insertMany/find/updateOne/updateMany/replaceOne/deleteOne/deleteMany
查询操作符
✅ 全支持
比较、逻辑、数组、元素、评估、地理空间操作符
更新操作符
✅ 全支持
字段更新、数组更新操作符
聚合管道
✅ 全支持
29 个管道阶段 + 100+ 聚合操作符
索引
✅ 全支持
单字段、复合、唯一、全文 (中英文)、地理空间索引
多文档事务
✅ 全支持
C013 版本新增,支持 snapshot 隔离级别
GridFS
✅ 全支持
大文件存储 (支持 10GB+ 超大文件)
安全
✅ 全支持
SCRAM-SHA-256 认证、SM4/RC4 透明存储加密
备份恢复
✅ 全支持
sys_dump/sys_restore + mongodump/mongorestore
数据迁移
✅ 全支持
mongodump/mongorestore/mongoexport/mongoimport
高可用集群
✅ 全支持
一主一备、自动故障切换、副本集连接
运维监控
✅ 全支持
管理命令、诊断命令、慢 SQL (sys_log + KWR)
KEMCC 平台
✅ 全支持
图形化管理、监控、备份、生命周期管理

1.4 关键配置参数

参数
类型
默认值
说明
documentdb.enableUserCrud
bool
false
是否允许通过 mongosh 创建和删除用户 (需设为 true)
documentdb.enableSchemaValidation
bool
false
是否允许对 JSON 数据进行模式校验
documentdb_core.enableCollation
bool
false
是否启用 collation (排序规则),设为 true 时按指定 collation 比较和排序
cron.database_name
string
-
定时任务所在数据库
log_min_duration_statement
int
-1
慢 SQL 阈值 (ms),设为 >=0 启用
archive_mode
enum
off
归档模式 (KEMCC 备份需设为 on)

1.5 安装要求

KingbaseES V9(文档版)安装方法与KingbaseES标准版相同,安装时需注意:

  1. 数据库管理员用户名保持默认 (system)
  2. 字符集选择 UTF8
  3. 数据库 Locale 选择 zh_CN.UTF-8 或 en_US.UTF-8

1.6 数据库连接方式

使用MongoDB Compass进行测试,连接配置如下:
image.png

2 MongoDB操作兼容测试

2.1 基础数据类型

MongoDB 行为: 支持 BSON 全量数据类型 (字符串、数值、布尔、日期、ObjectId、内嵌文档、数组等)

db.dataType.drop()
db.dataType.insertOne({_id: 1, val: "abc"})  // 字符串
db.dataType.insertOne({_id: 2, val: NumberInt(100)})  // int32
db.dataType.insertOne({_id: 3, val: NumberLong("123456789012345")})  // int64
db.dataType.insertOne({_id: 4, val: true})  // 布尔
db.dataType.insertOne({_id: 5, val: 19.99})  // 双精度浮点
db.dataType.insertOne({_id: 6, val: new Date("2025-01-01T00:00:00Z")})  // 日期
db.dataType.insertOne({_id: 7, val: Timestamp(1735689600, 1)})  // 时间戳
db.dataType.insertOne({_id: 8, val: ObjectId("65857a7f1234567890abcdef")})  // ObjectId
db.dataType.insertOne({_id: 9, val: {name: "张三", age: 20}})  // 内嵌文档
db.dataType.insertOne({_id: 10, val: null})  // 空值
db.dataType.insertOne({_id: 11, val: BinData(0, "SGVsbG8gTW9uZ29EQg==")})  // 二进制
db.dataType.insertOne({_id: 12, val: /mongodb/i})  // 正则表达式
db.dataType.insertOne({_id: 13, val: ["reading", "running"]})  // 数组
db.dataType.find()

image.png
KingbaseES 行为: ✅ 完全兼容

2.2 集合创建与文档插入

MongoDB 语法: db.createCollection() 显式创建 / db.coll.insertOne() 隐式创建

// 隐式创建
db.inventory.drop()
db.inventory.insertOne({status: 'D', qty: 20, item: ['paper']})
db.inventory.insertOne({status: 'A', qty: 50, item: ['ruler']})
db.inventory.find()

// 显式创建
db.inventory.drop()
db.createCollection('inventory')
db.inventory.insertOne({status: 'D', qty: 20, item: ['paper']})
db.inventory.find()

image.png
image.png
测试结果: ✅ 完全兼容

2.3 批量插入文档

MongoDB 语法: db.coll.insertMany([...])

db.scientists.drop()
db.scientists.insertMany([
   {name: {firstname: 'Alan', lastname: 'Turing'}, born: 1912, invention: 'Turing Machine'},
   {name: {firstname: 'Graham', lastname: 'Bell'}, born: 1847, invention: 'Telephone'}
])
db.scientists.find()

image.png
测试结果: ✅ 完全兼容

2.4 查询指定相等条件

MongoDB 语法: db.coll.find({field: value})

db.inventory.drop()
db.inventory.insertOne({status: 'D', qty: 20, item: ['paper']})
db.inventory.insertOne({status: 'A', qty: 50, item: ['ruler']})
db.inventory.find({status: "D"})
// 返回 {status: 'D', qty: 20, item: ['paper']} 的文档

image.png
测试结果: ✅ 完全兼容

2.5 查询操作符 ($in)

MongoDB 语法: db.coll.find({field: {$in: [...]}})

db.inventory.find({status: {$in: ["A", "D"]}})
// 返回 status 为 A 或 D 的所有文档

image.png
测试结果: ✅ 完全兼容

2.6 AND 条件查询

MongoDB 语法: 逗号分隔条件 (隐式 AND) / $and 操作符 (显式 AND)

// 隐式 AND
db.inventory.find({status: "D", qty: {$lt: 30}})
// 显式 AND
db.inventory.find({$and: [{status: "D"}, {qty: {$lt: 30}}]})

image.png

测试结果: ✅ 完全兼容

2.7 OR 条件查询

MongoDB 语法: db.coll.find({$or: [{...}, {...}]})

db.inventory.find({$or: [{status: "A"}, {status: "D"}]})
// 返回 status 为 A 或 D 的所有文档

image.png
测试结果: ✅ 完全兼容

2.8 AND 与 OR 组合查询

MongoDB 行为: 支持在同一查询中组合 AND 和 OR 条件

db.inventory.find({status: "D", $or: [{qty: {$lt: 30}}, {item: /^p/}]})
db.inventory.find({$and: [{status: "D"}, {$or: [{qty: {$lt: 30}}, {item: /^p/}]}]})

image.png
测试结果: ✅ 完全兼容

2.9 更新单个文档

MongoDB 语法: db.coll.updateOne(filter, update)

db.inventory.drop()
db.inventory.insertOne({status: 'D', qty: 20, item: ['paper']})
db.inventory.find()
db.inventory.updateOne(
   {item: "paper"},
   {$set: {"size.uom": "cm", status: "P"}, $currentDate: {lastModified: true}}
)
db.inventory.find()
// 文档成功更新,size.uom 和 status 被修改,lastModified 被设为当前时间

image.png
测试结果: ✅ 完全兼容

2.10 更新多个文档

MongoDB 语法: db.coll.updateMany(filter, update)

db.inventory.drop()
db.inventory.insertOne({status: 'D', qty: 20, item: ['paper']})
db.inventory.insertOne({status: 'A', qty: 50, item: ['ruler']})
db.inventory.find()
db.inventory.updateMany(
   {qty: {$lt: 60}},
   {$set: {"size.uom": "in", status: "Y"}}
)
db.inventory.find()
// 所有 qty < 60 的文档均被更新

image.png
测试结果: ✅ 完全兼容

2.11 替换文档

MongoDB 语法: db.coll.replaceOne(filter, replacement)

db.inventory.replaceOne(
   {item: "paper"},
   {item: "paper", instock: [{warehouse: "A", qty: 60}, {warehouse: "B", qty: 40}]}
)
db.inventory.find()
// 匹配文档被完整替换 (除 _id 外)

image.png
测试结果: ✅ 完全兼容

2.12 删除所有文档

MongoDB 语法: db.coll.deleteMany({})

db.inventory.deleteMany({})
// 集合中所有文档被删除

image.png
测试结果: ✅ 完全兼容

2.13 删除符合条件的所有文档

MongoDB 语法: db.coll.deleteMany({field: value})

db.inventory.insertOne({status: 'A', qty: 20, item: ['paper']})
db.inventory.insertOne({status: 'A', qty: 50, item: ['ruler']})
db.inventory.insertOne({status: 'D', qty: 70, item: ['ruler']})
db.inventory.find()
db.inventory.deleteMany({status: "A"})
db.inventory.find({status: "A"})
// 返回空,所有 status="A" 的文档已删除

image.png
测试结果: ✅ 完全兼容

2.14 仅删除一个符合条件的文档

MongoDB 语法: db.coll.deleteOne({field: value})

db.inventory.insertOne({status: 'A', qty: 20, item: ['paper']})
db.inventory.insertOne({status: 'A', qty: 50, item: ['ruler']})
db.inventory.find()
db.inventory.deleteOne({status: "A"})
db.inventory.find({status: "A"})
// 仅删除第一个匹配文档,剩余一个 status="A" 的文档

image.png
测试结果: ✅ 完全兼容

3 查询操作符兼容测试

3.1 比较查询操作符

db.scores.drop()
db.scores.insertMany([
   {_id: 1, score: 85}, {_id: 2, score: 90}, {_id: 3, score: 60}, {_id: 4, score: 75}
])
db.scores.find({score: {$gte: 80}})  // 返回 _id: 1, 2
db.scores.find({score: {$lt: 70}})  // 返回 _id: 3
db.scores.find({score: {$in: [60, 90]}})  // 返回 _id: 2, 3
db.scores.find({score: {$nin: [60, 90]}})  // 返回 _id: 1, 4

image.png
测试结果: ✅ 完全兼容

操作符
说明
兼容性
$eq
等于
✅
$gt
大于
✅
$gte
大于等于
✅
$lt
小于
✅
$lte
小于等于
✅
$in
在指定数组内
✅
$ne
不等于
✅
$nin
不在指定数组内
✅

3.2 逻辑查询操作符

db.scores.find({$and: [{score: {$gte: 70}}, {score: {$lt: 90}}]})  // 返回 _id: 1, 4
db.scores.find({$or: [{score: {$lt: 65}}, {score: {$gt: 85}}]})  // 返回 _id: 2, 3
db.scores.find({score: {$not: {$gt: 80}}})  // 返回 _id: 3, 4
db.scores.find({$nor: [{score: 85}, {score: 90}]})  // 返回 _id: 3, 4

image.png
测试结果: ✅ 完全兼容

操作符
说明
兼容性
$and
逻辑与
✅
$or
逻辑或
✅
$not
逻辑非
✅
$nor
逻辑或非
✅

3.3 数组查询操作符

db.articles.drop()
db.articles.insertMany([
   {tags: ["ssl", "security"]},
   {tags: ["ssl2", "security2"]},
   {tags: ["ssl", "security", "crypto"]}
])
db.articles.find({tags: {$all: ["ssl", "security"]}})  // 返回第 1、3 条
db.articles.find({tags: {$size: 2}})  // 返回第 1、2 条

db.scores2.drop()
db.scores2.insertMany([
   {_id: 1, results: [82, 85, 88]},
   {_id: 2, results: [75, 88, 89]}
])
db.scores2.find({results: {$elemMatch: {$gte: 80, $lt: 85}}})  // 返回 _id: 1

image.png
测试结果: ✅ 完全兼容

操作符
说明
兼容性
$all
包含数组中所有元素
✅
$elemMatch
数组元素匹配
✅
$size
数组长度匹配
✅

3.4 元素查询操作符

db.records.drop()
db.records.insertMany([
   {_id: 1, a: 1},
   {_id: 2, a: null},
   {_id: 3, b: 1}
])
db.records.find({a: {$exists: true}})  // 返回 _id: 1, 2
db.records.find({a: {$exists: false}})  // 返回 _id: 3
db.records.find({a: {$type: "int"}})  // 返回 _id: 1

image.png
测试结果: ✅ 完全兼容

3.5 正则表达式查询 ($regex)

db.products.drop()
db.products.insertMany([
   {_id: 1, sku: "abc123"},
   {_id: 2, sku: "abc456"},
   {_id: 3, sku: "def789"}
])
db.products.find({sku: /^abc/})  // 返回 _id: 1, 2
db.products.find({sku: {$regex: "789$"}})  // 返回 _id: 3
db.products.find({sku: {$regex: /ABC/i}})  // 返回 _id: 1, 2 (大小写不敏感)

image.png
测试结果: ✅ 完全兼容

3.6 投影操作符 ($slice)

db.posts.drop()
db.posts.insertMany([
   {_id: 1, title: "Bagels are not croissants.", comments: [{comment: "0. true"}, {comment: "1. croissants"}]},
   {_id: 2, title: "Coffee please.", comments: [{comment: "0. fooey"}, {comment: "1. tea"}, {comment: "2. iced coffee"}, {comment: "3. cappuccino"}, {comment: "4. whatever"}]}
])
db.posts.find({}, {comments: {$slice: 3}})  // 每条文档最多返回前 3 条评论

image.png
测试结果: ✅ 完全兼容

4 更新操作符兼容测试

4.1 字段更新操作符

db.products.drop()
db.products.insertOne({_id: 1, sku: "abc123", quantity: 10, metrics: {orders: 2, ratings: 3.5}})

// $inc 自增
db.products.updateOne({sku: "abc123"}, {$inc: {quantity: -2, "metrics.orders": 1}})
db.products.find()
// quantity: 8, metrics.orders: 3

// $set 设置新字段
db.products.updateOne({sku: "abc123"}, {$set: {"metrics.ratings": 4.0}})
db.products.find()
// metrics.ratings: 4.0

// $mul 自乘
db.products.updateOne({sku: "abc123"}, {$mul: {quantity: 2}})
db.products.find()
// quantity: 16

// $unset 删除字段
db.products.updateOne({sku: "abc123"}, {$unset: {"metrics.ratings": ""}})
db.products.find()
// metrics.ratings 被删除

// $rename 重命名
db.products.updateOne({sku: "abc123"}, {$rename: {quantity: "qty"}})
db.products.find()
// quantity -> qty

// $min / $max
db.products.updateOne({sku: "abc123"}, {$min: {qty: 10}})  // qty: 10 (10 < 16)
db.products.updateOne({sku: "abc123"}, {$max: {qty: 20}})  // qty: 20 (20 > 10)
db.products.find()

// $currentDate
db.products.updateOne({sku: "abc123"}, {$currentDate: {lastModified: true}})
db.products.find()
// lastModified 设为当前时间

image.png
测试结果: ✅ 完全兼容

操作符
说明
兼容性
$set
设置字段值
✅
$unset
删除字段
✅
$inc
自增
✅
$mul
自乘
✅
$rename
重命名字段
✅
$min
取较小值
✅
$max
取较大值
✅
$currentDate
设为当前时间
✅
$setOnInsert
仅插入时设值
✅

4.2 数组更新操作符

db.students.drop()
db.students.insertOne({_id: 1, name: "Alice", grades: [85, 90]})

// $push 添加单个元素
db.students.updateOne({_id: 1}, {$push: {grades: 95}})
db.students.find()
// grades: [85, 90, 95]

// $push + $each 添加多个元素
db.students.updateOne({_id: 1}, {$push: {grades: {$each: [88, 92]}}})
db.students.find()
// grades: [85, 90, 95, 88, 92]

// $addToSet 添加不重复元素
db.students.updateOne({_id: 1}, {$addToSet: {grades: 85}})
db.students.find()
// grades 不变 (85 已存在)

// $pull 移除匹配元素
db.students.updateOne({_id: 1}, {$pull: {grades: {$lt: 88}}})
db.students.find()
// grades: [90, 95, 88, 92]

// $pop 移除末尾元素
db.students.updateOne({_id: 1}, {$pop: {grades: 1}})
db.students.find()
// grades: [90, 95, 88]

// $push + $sort + $slice 排序并限制长度
db.students.updateOne({_id: 1}, {$push: {grades: {$each: [80, 100], $sort: -1, $slice: 3}}})
db.students.find()
// grades: [100, 95, 90] (降序,保留前 3)

image.png
测试结果: ✅ 完全兼容

操作符
说明
兼容性
$push
向数组添加元素
✅
$addToSet
向数组添加不重复元素
✅
$pop
移除数组首/尾元素
✅
$pull
移除数组中匹配元素
✅
$pullAll
移除数组中所有匹配元素
✅
$each
配合 addToSet 添加多个元素
✅
$position
指定插入位置
✅
$slice
限制数组长度
✅
$sort
数组排序
✅

五、聚合操作兼容测试

5.1 聚合管道 ($match + $group)

MongoDB 语法: db.coll.aggregate([{$match: ...}, {$group: ...}])

db.orders.drop()
db.orders.insertMany([
   {_id: 0, type: "chicken", size: "small", price: 4, quantity: 2},
   {_id: 1, type: "chicken", size: "medium", price: 5, quantity: 1},
   {_id: 2, type: "chicken", size: "medium", price: 6, quantity: 5},
   {_id: 3, type: "beef", size: "medium", price: 7, quantity: 8},
   {_id: 4, type: "vegetable", size: "medium", price: 6, quantity: 3},
   {_id: 5, type: "vegetable", size: "large", price: 8, quantity: 4}
])

db.orders.aggregate([
   {$match: {size: "medium"}},
   {$group: {_id: "$type", totalQuantity: {$sum: "$quantity"}}}
])
// 按 type 分组,统计 medium 尺寸的总数量

image.png
测试结果: ✅ 完全兼容

5.2 聚合管道阶段 ($addFields)

db.scores.drop()
db.scores.insertMany([
   {_id: 1, student: "Maya", homework: [10, 5, 10], quiz: [10, 8], extraCredit: 0},
   {_id: 2, student: "Ryan", homework: [5, 6, 5], quiz: [8, 8], extraCredit: 8}
])

db.scores.aggregate([
   {$addFields: {
       totalHomework: {$sum: "$homework"},
       totalQuiz: {$sum: "$quiz"}
   }},
   {$addFields: {
       totalScore: {$add: ["$totalHomework", "$totalQuiz", "$extraCredit"]}
   }}
])
// 每条文档新增 totalHomework, totalQuiz, totalScore 字段

image.png
测试结果: ✅ 完全兼容

5.3 聚合管道操作符 ($abs + $subtract)

db.temperatureChange.drop()
db.temperatureChange.insertMany([
   {_id: 1, startTemp: 50, endTemp: 80},
   {_id: 2, startTemp: 40, endTemp: 40},
   {_id: 3, startTemp: 90, endTemp: 70},
   {_id: 4, startTemp: 60, endTemp: 70}
])

db.temperatureChange.aggregate([
   {$project: {delta: {$abs: {$subtract: ["$startTemp", "$endTemp"]}}}}
])
// 计算温度变化的绝对值: 30, 0, 20, 10

image.png
测试结果: ✅ 完全兼容

5.4 聚合管道阶段兼容一览

阶段
说明
兼容性
$addFields
添加新字段
✅
$bucket
分桶分类
✅
$bucketAuto
自动分桶
✅
$collStats
集合统计
✅
$count
计数
✅
$densify
密集化文档
✅
$documents
内联文档
✅
$facet
多管道分支
✅
$fill
填充空值
✅
$geoNear
地理空间近邻
✅
$graphLookup
图遍历查询
✅
$group
分组聚合
✅
$indexStats
索引统计
✅
$limit
限制结果数
✅
$lookup
关联查询
✅
$match
过滤
✅
$merge
合并输出
✅
$out
输出到集合
✅
$project
字段投影
✅
$replaceRoot
替换根文档
✅
$replaceWith
替换文档
✅
$sample
随机采样
✅
$set
设置字段 (同 $addFields)
✅
$skip
跳过文档
✅
$sort
排序
✅
$sortByCount
按值计数排序
✅
$unset
移除字段
✅
$unwind
数组展开
✅

5.5 其他聚合操作符兼容一览

操作符类别
代表操作符
兼容性
算术运算
$add
$subtract$multiply$divide$mod$abs$ceil$floor$pow$sqrt
✅
字符串操作
$concat
$substr$toLower$toUpper$trim$split$strcasecmp
✅
数组操作
$arrayElemAt
$concatArrays$filter$map$reduce$size$slice$sortArray
✅
类型转换
$toString
$toInt$toLong$toDouble$toDecimal$toBool$toDate$toObjectId
✅
日期操作
$year
$month$dayOfMonth$hour$minute$second$dayOfWeek$dayOfYear$week
✅
条件判断
$cond
$switch$ifNull
✅
集合操作
$setUnion
$setIntersection$setDifference$setIsSubset$setEquals
✅
统计聚合
$sum
$avg$min$max$stdDevPop$stdDevSamp$first$last
✅
排序取值
$top
$topN$bottom$bottomN
✅
窗口函数
$shift
$denseRank$rank$documentNumber
✅

六、索引兼容测试

6.1 单字段索引

MongoDB 语法: db.coll.createIndex({field: 1})

db.students.drop()
db.students.insertMany([
   {name: "ZhangMing", gpa: 3.6, location: {city: "Beijing"}},
   {name: "LiHua", gpa: 3.8, location: {city: "Shanghai"}},
   {name: "WangFang", gpa: 3.2, location: {city: "Guangzhou"}}
])
db.students.createIndex({name: 1})
db.students.getIndexes()

image.png
测试结果: ✅ 完全兼容

6.2 复合索引

db.students.createIndex({name: 1, gpa: -1})
db.students.getIndexes()

image.png
测试结果: ✅ 完全兼容

6.3 唯一索引

db.students.dropIndex({name: 1})
db.students.dropIndex({name: 1, gpa: -1})
db.students.createIndex({name: 1}, {unique: true})
// 插入重复 name 会报错
db.students.insertOne({name: "ZhangMing", gpa: 3.9})  // 报错: E11000 duplicate key

image.png
测试结果: ✅ 完全兼容

6.4 全文索引

db.articles.drop()
db.articles.insertMany([
   {title: "MongoDB 入门指南", content: "本文介绍 MongoDB 基础知识"},
   {title: "KingbaseES 文档版", content: "KingbaseES 兼容 MongoDB 协议"},
   {title: "Database Tutorial", content: "Learn database fundamentals"}
])
db.articles.createIndex({title: "text", content: "text"})
db.articles.find({$text: {$search: "MongoDB"}})  // 英文搜索
db.articles.find({$text: {$search: "文档版"}})  // 中文搜索

image.png
测试结果: ✅ 完全兼容 (支持中英文)

6.5 查看与删除索引

db.students.getIndexes()  // 查看所有索引
db.students.dropIndex("name_1")  // 删除指定索引
db.students.dropIndexes()  // 删除所有索引 (除 _id 外)

测试结果: ✅ 完全兼容

7 语法兼容性总结

测试类别
完全兼容
部分兼容
不兼容
兼容率
文档操作 (CRUD)
14
0
0
100%
查询操作符
6
0
0
100%
更新操作符
2
0
0
100%
聚合操作
5
0
0
100%
索引
5
0
0
100%
合计3200100%

总结

KingbaseES V9(文档版)以其与MongoDB高度的语法兼容性,使其成为替换MongoDB的优选方案。

老规矩,知道写了些啥。