首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >这款国产数据库也能替掉MongoDB

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

作者头像
胖头鱼的鱼缸
发布2026-07-27 13:15:14
发布2026-07-27 13:15:14
1290
举报

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

代码语言:javascript
复制
作者:胖头鱼的鱼缸(尹海文)
Oracle ACE Pro: Database
PostgreSQL ACE

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

全网同名:胖头鱼的鱼缸
ITPUB:yhw1809
除授权转载并标明出处外,均为“非法”抄袭
914fcc7ad57defa7868c3be1ca7fb4f5.jpg
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
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-8en_US.UTF-8

1.6 数据库连接方式

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

image.png
image.png

2 MongoDB操作兼容测试

2.1 基础数据类型

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

代码语言:javascript
复制
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
image.png

KingbaseES 行为: ✅ 完全兼容

2.2 集合创建与文档插入

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

代码语言:javascript
复制
// 隐式创建
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
image.png
image.png

测试结果: ✅ 完全兼容

2.3 批量插入文档

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

代码语言:javascript
复制
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
image.png

测试结果: ✅ 完全兼容

2.4 查询指定相等条件

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

代码语言:javascript
复制
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
image.png

测试结果: ✅ 完全兼容

2.5 查询操作符 ($in)

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

代码语言:javascript
复制
db.inventory.find({status: {$in: ["A", "D"]}})
// 返回 status 为 A 或 D 的所有文档
image.png
image.png

测试结果: ✅ 完全兼容

2.6 AND 条件查询

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

代码语言:javascript
复制
// 隐式 AND
db.inventory.find({status: "D", qty: {$lt: 30}})
// 显式 AND
db.inventory.find({$and: [{status: "D"}, {qty: {$lt: 30}}]})
image.png
image.png

测试结果: ✅ 完全兼容

2.7 OR 条件查询

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

代码语言:javascript
复制
db.inventory.find({$or: [{status: "A"}, {status: "D"}]})
// 返回 status 为 A 或 D 的所有文档
image.png
image.png

测试结果: ✅ 完全兼容

2.8 AND 与 OR 组合查询

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

代码语言:javascript
复制
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
image.png

测试结果: ✅ 完全兼容

2.9 更新单个文档

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

代码语言:javascript
复制
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
image.png

测试结果: ✅ 完全兼容

2.10 更新多个文档

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

代码语言:javascript
复制
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
image.png

测试结果: ✅ 完全兼容

2.11 替换文档

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

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

测试结果: ✅ 完全兼容

2.12 删除所有文档

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

代码语言:javascript
复制
db.inventory.deleteMany({})
// 集合中所有文档被删除
image.png
image.png

测试结果: ✅ 完全兼容

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

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

代码语言:javascript
复制
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
image.png

测试结果: ✅ 完全兼容

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

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

代码语言:javascript
复制
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
image.png

测试结果: ✅ 完全兼容

3 查询操作符兼容测试

3.1 比较查询操作符

代码语言:javascript
复制
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
image.png

测试结果: ✅ 完全兼容

操作符

说明

兼容性

$eq

等于

$gt

大于

$gte

大于等于

$lt

小于

$lte

小于等于

$in

在指定数组内

$ne

不等于

$nin

不在指定数组内

3.2 逻辑查询操作符

代码语言:javascript
复制
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
image.png

测试结果: ✅ 完全兼容

操作符

说明

兼容性

$and

逻辑与

$or

逻辑或

$not

逻辑非

$nor

逻辑或非

3.3 数组查询操作符

代码语言:javascript
复制
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
image.png

测试结果: ✅ 完全兼容

操作符

说明

兼容性

$all

包含数组中所有元素

$elemMatch

数组元素匹配

$size

数组长度匹配

3.4 元素查询操作符

代码语言:javascript
复制
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
image.png

测试结果: ✅ 完全兼容

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

代码语言:javascript
复制
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
image.png

测试结果: ✅ 完全兼容

3.6 投影操作符 ($slice)

代码语言:javascript
复制
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
image.png

测试结果: ✅ 完全兼容

4 更新操作符兼容测试

4.1 字段更新操作符

代码语言:javascript
复制
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
image.png

测试结果: ✅ 完全兼容

操作符

说明

兼容性

$set

设置字段值

$unset

删除字段

$inc

自增

$mul

自乘

$rename

重命名字段

$min

取较小值

$max

取较大值

$currentDate

设为当前时间

$setOnInsert

仅插入时设值

4.2 数组更新操作符

代码语言:javascript
复制
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
image.png

测试结果: ✅ 完全兼容

操作符

说明

兼容性

$push

向数组添加元素

$addToSet

向数组添加不重复元素

$pop

移除数组首/尾元素

$pull

移除数组中匹配元素

$pullAll

移除数组中所有匹配元素

$each

配合 push/push/addToSet 添加多个元素

$position

指定插入位置

$slice

限制数组长度

$sort

数组排序

五、聚合操作兼容测试

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

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

代码语言:javascript
复制
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
image.png

测试结果: ✅ 完全兼容

5.2 聚合管道阶段 ($addFields)

代码语言:javascript
复制
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
image.png

测试结果: ✅ 完全兼容

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

代码语言:javascript
复制
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
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})

代码语言:javascript
复制
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
image.png

测试结果: ✅ 完全兼容

6.2 复合索引

代码语言:javascript
复制
db.students.createIndex({name: 1, gpa: -1})
db.students.getIndexes()
image.png
image.png

测试结果: ✅ 完全兼容

6.3 唯一索引

代码语言:javascript
复制
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
image.png

测试结果: ✅ 完全兼容

6.4 全文索引

代码语言:javascript
复制
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
image.png

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

6.5 查看与删除索引

代码语言:javascript
复制
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%

合计

32

0

0

100%

总结

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

老规矩,知道写了些啥。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 胖头鱼的技术专栏-452 这款国产数据库也能替掉MongoDB(20260727)
    • 1 版本介绍
      • 1.1 产品定位
      • 1.2 核心架构
      • 1.3 功能概览
      • 1.4 关键配置参数
      • 1.5 安装要求
      • 1.6 数据库连接方式
    • 2 MongoDB操作兼容测试
      • 2.1 基础数据类型
      • 2.2 集合创建与文档插入
      • 2.3 批量插入文档
      • 2.4 查询指定相等条件
      • 2.5 查询操作符 ($in)
      • 2.6 AND 条件查询
      • 2.7 OR 条件查询
      • 2.8 AND 与 OR 组合查询
      • 2.9 更新单个文档
      • 2.10 更新多个文档
      • 2.11 替换文档
      • 2.12 删除所有文档
      • 2.13 删除符合条件的所有文档
      • 2.14 仅删除一个符合条件的文档
    • 3 查询操作符兼容测试
      • 3.1 比较查询操作符
      • 3.2 逻辑查询操作符
      • 3.3 数组查询操作符
      • 3.4 元素查询操作符
      • 3.5 正则表达式查询 ($regex)
      • 3.6 投影操作符 ($slice)
    • 4 更新操作符兼容测试
      • 4.1 字段更新操作符
      • 4.2 数组更新操作符
    • 五、聚合操作兼容测试
      • 5.1 聚合管道 ($match + $group)
      • 5.2 聚合管道阶段 ($addFields)
      • 5.3 聚合管道操作符 ($abs + $subtract)
      • 5.4 聚合管道阶段兼容一览
      • 5.5 其他聚合操作符兼容一览
    • 六、索引兼容测试
      • 6.1 单字段索引
      • 6.2 复合索引
      • 6.3 唯一索引
      • 6.4 全文索引
      • 6.5 查看与删除索引
    • 7 语法兼容性总结
    • 总结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档