
作者:胖头鱼的鱼缸(尹海文)
Oracle ACE Pro: Database
PostgreSQL ACE
10 年 + 数据库行业经验
拥有 OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP 等认证
墨天轮 MVP,ITPUB 认证专家
圈内拥有“总监”称号,非著名社恐(社交恐怖分子)
全网同名:胖头鱼的鱼缸
ITPUB:yhw1809
除授权转载并标明出处外,均为“非法”抄袭

这个月才测完了金仓数据库的MySQL兼容模式,这几天麦麦又告诉我他们的KingbaseES V9(文档版)也开始内测了,并直接发来了内测软件包和相关材料。作为OPC(无业游民)的我,自然继续担起了摸索语法兼容性的重任。
本次测试环境和之前一样2C8G,100GB磁盘的RHEL 8.10虚拟机上,数据库的配置与安装过程省略。
KingbaseES作为一款支持多模的数据库产品,在传统关系型数据库的同时,也支持NoSQL数据库,而MongoDB作为NoSQL数据库的代表,KingbaseES同样对其进行了兼容。
KingbaseES V9(文档版)实现了协议级兼容MongoDB,可以直接使用MongoDB的客户端(mongosh、MongoDB Compass)或其他语言驱动程序进行连接,无需修改应用代码即可完成从MongoDB到KingbaseES的迁移。
项目 | 说明 |
|---|---|
产品名称 | 金仓数据库管理系统 V9(文档版) |
版本号 | V009R200C013B001PS002 |
兼容目标 | MongoDB 5.0+ |
兼容层级 | 协议级兼容(BSON 协议) |
数据库模式 | PG 模式(安装时选择) |
字符集 | UTF8 |
KingbaseES文档版通过documentdb 插件提供MongoDB兼容能力。该插件在KingbaseES关系型存储引擎之上实现了BSON文档存储、MongoDB查询协议和全套MongoDB命令接口。

功能类别 | 支持情况 | 说明 |
|---|---|---|
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 平台 | ✅ 全支持 | 图形化管理、监控、备份、生命周期管理 |
参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
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) |
KingbaseES V9(文档版)安装方法与KingbaseES标准版相同,安装时需注意:
zh_CN.UTF-8 或 en_US.UTF-8使用MongoDB Compass进行测试,连接配置如下:

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()

KingbaseES 行为: ✅ 完全兼容
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()


测试结果: ✅ 完全兼容
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()

测试结果: ✅ 完全兼容
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']} 的文档

测试结果: ✅ 完全兼容
MongoDB 语法: db.coll.find({field: {$in: [...]}})
db.inventory.find({status: {$in: ["A", "D"]}})
// 返回 status 为 A 或 D 的所有文档

测试结果: ✅ 完全兼容
MongoDB 语法: 逗号分隔条件 (隐式 AND) / $and 操作符 (显式 AND)
// 隐式 AND
db.inventory.find({status: "D", qty: {$lt: 30}})
// 显式 AND
db.inventory.find({$and: [{status: "D"}, {qty: {$lt: 30}}]})

测试结果: ✅ 完全兼容
MongoDB 语法: db.coll.find({$or: [{...}, {...}]})
db.inventory.find({$or: [{status: "A"}, {status: "D"}]})
// 返回 status 为 A 或 D 的所有文档

测试结果: ✅ 完全兼容
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/}]}]})

测试结果: ✅ 完全兼容
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 被设为当前时间

测试结果: ✅ 完全兼容
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 的文档均被更新

测试结果: ✅ 完全兼容
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 外)

测试结果: ✅ 完全兼容
MongoDB 语法: db.coll.deleteMany({})
db.inventory.deleteMany({})
// 集合中所有文档被删除

测试结果: ✅ 完全兼容
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" 的文档已删除

测试结果: ✅ 完全兼容
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" 的文档

测试结果: ✅ 完全兼容
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

测试结果: ✅ 完全兼容
操作符 | 说明 | 兼容性 |
|---|---|---|
$eq | 等于 | ✅ |
$gt | 大于 | ✅ |
$gte | 大于等于 | ✅ |
$lt | 小于 | ✅ |
$lte | 小于等于 | ✅ |
$in | 在指定数组内 | ✅ |
$ne | 不等于 | ✅ |
$nin | 不在指定数组内 | ✅ |
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

测试结果: ✅ 完全兼容
操作符 | 说明 | 兼容性 |
|---|---|---|
$and | 逻辑与 | ✅ |
$or | 逻辑或 | ✅ |
$not | 逻辑非 | ✅ |
$nor | 逻辑或非 | ✅ |
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

测试结果: ✅ 完全兼容
操作符 | 说明 | 兼容性 |
|---|---|---|
$all | 包含数组中所有元素 | ✅ |
$elemMatch | 数组元素匹配 | ✅ |
$size | 数组长度匹配 | ✅ |
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

测试结果: ✅ 完全兼容
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 (大小写不敏感)

测试结果: ✅ 完全兼容
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 条评论

测试结果: ✅ 完全兼容
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 设为当前时间

测试结果: ✅ 完全兼容
操作符 | 说明 | 兼容性 |
|---|---|---|
$set | 设置字段值 | ✅ |
$unset | 删除字段 | ✅ |
$inc | 自增 | ✅ |
$mul | 自乘 | ✅ |
$rename | 重命名字段 | ✅ |
$min | 取较小值 | ✅ |
$max | 取较大值 | ✅ |
$currentDate | 设为当前时间 | ✅ |
$setOnInsert | 仅插入时设值 | ✅ |
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)

测试结果: ✅ 完全兼容
操作符 | 说明 | 兼容性 |
|---|---|---|
$push | 向数组添加元素 | ✅ |
$addToSet | 向数组添加不重复元素 | ✅ |
$pop | 移除数组首/尾元素 | ✅ |
$pull | 移除数组中匹配元素 | ✅ |
$pullAll | 移除数组中所有匹配元素 | ✅ |
$each | 配合 push/push/addToSet 添加多个元素 | ✅ |
$position | 指定插入位置 | ✅ |
$slice | 限制数组长度 | ✅ |
$sort | 数组排序 | ✅ |
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 尺寸的总数量

测试结果: ✅ 完全兼容
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 字段

测试结果: ✅ 完全兼容
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

测试结果: ✅ 完全兼容
阶段 | 说明 | 兼容性 |
|---|---|---|
$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 | 数组展开 | ✅ |
操作符类别 | 代表操作符 | 兼容性 |
|---|---|---|
算术运算 | $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 | ✅ |
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()

测试结果: ✅ 完全兼容
db.students.createIndex({name: 1, gpa: -1})
db.students.getIndexes()

测试结果: ✅ 完全兼容
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

测试结果: ✅ 完全兼容
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: "文档版"}}) // 中文搜索

测试结果: ✅ 完全兼容 (支持中英文)
db.students.getIndexes() // 查看所有索引
db.students.dropIndex("name_1") // 删除指定索引
db.students.dropIndexes() // 删除所有索引 (除 _id 外)
测试结果: ✅ 完全兼容
测试类别 | 完全兼容 | 部分兼容 | 不兼容 | 兼容率 |
|---|---|---|---|---|
文档操作 (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的优选方案。
老规矩,知道写了些啥。