针对旧版 mongo
Shell 的兼容性变更
在此页面上
本页介绍了 mongosh
和旧版 mongo
shell之间的差异。 除了此处列出的替代方案之外,您还可以使用 mongocompat 代码段以访问权限旧版mongo
shell API。代码片段是一项实验性功能,有关更多信息,请参阅代码片段。
snippet install mongocompat
已弃用的方法
mongosh
中已弃用以下 Shell 方法。请改用 Alternative Resources 列中列出的方法。
已弃用的方法 | 替代资源 |
---|---|
| 聚合阶段: |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| 不再需要。 请参阅从节点上的读取操作。 |
读取偏好行为
从节点上的读取操作
使用传统mongo shell直接连接从从节点(secondary node from replica set)副本集成员时,必须运行mongo.setReadPref()
以启用从从节点(secondary node from replica set)读取。
使用 mongosh
直接连接到从副本集节点时,如果将读取偏好指定为以下任一选项,则可从该节点读取:
要指定读取偏好,您可以使用以下任一项:
连接到节点时的
readPreference
连接string选项。
使用mongosh
直接连接到副本集从节点(secondary node from replica set)节点时,如果您的读取偏好(read preference)设立为primaryPreferred
、 secondary
或secondaryPreferred
,则无需运行rs.secondaryOk()
。
show
辅助方法
即使已为操作指定了不同的读取偏好,以下 show
助手方法始终使用读取偏好 primaryPreferred
:
show dbs
show databases
show collections
show tables
在旧版 mongo
shell 中,这些操作使用指定的读取偏好。
写入偏好行为
mongosh
中默认启用可重试写入。旧版
mongo
shell 中默认禁用可重试写入。要禁用可重试写入功能,请使用 --retryWrites=false
。
对象标识符(ObjectId)方法和属性
这些ObjectId ()方法在 mongosh
中的工作方式与在旧版 mongo
shell中的工作方式不同。
方法或属性 | mongo 行为 | mongosh 行为 |
---|---|---|
| Returns a hexadecimal string: 6419ccfce40afaf9317567b7 | Undefined (Not available) |
| Returns the value of ObjectId.str :6419ccfce40afaf9317567b7 | Returns a formatted string: ObjectId("6419ccfce40afaf9317567b7") |
| Returns a formatted string: ObjectId("6419ccfce40afaf9317567b7") | Returns a hexadecimal formatted string: 6419ccfce40afaf9317567b7 |
Numeric Values
默认情况下,传统 mongo
Shell 将数值存储为 doubles
。在 mongosh
中,数字存储为 32 位整数 Int32
,或者如果该值无法存储为 Int32
,则存储为 Double
。
MongoDB Shell 继续支持 mongo
Shell 所支持的数字类型。但偏好类型已更新,以便更好地与 MongoDB 驱动程序保持一致。有关更多信息,请参阅 Mongosh 数据类型。
MongoDB Shell 中数字变量的首选类型与旧版 mongo
shell 中建议的类型不同。mongosh
中的类型更好地契合 MongoDB 驱动程序使用的类型。
mongo 类型 | mongosh 类型 |
---|---|
|
|
|
|
|
|
警告
如果您同时使用 mongosh
和旧版 mongo
shell 连接到同一集合,则数据类型的存储方式可能会不一致。
未定义的值
未定义的BSON类型已弃用。如果您尝试在 mongosh
中插入具有未定义JavaScript类型的文档,则您的部署会将文档中的未定义值替换为BSON null 值。 不支持使用 mongosh
将未定义值插入数据库。
示例,考虑运行以下代码以在 mongosh
中插入文档:
db.people.insertOne( { name : "Sally", age : undefined } )
当您在 mongosh
中运行此代码时, Shell会插入以下文档:
{ name : "Sally", age : null }
mongosh
表示使用其他工具(例如Go驱动程序或旧版 mongo
Shell)存储为 null 的任何BSON未定义值。
对象引用行为
mongosh
在输出中不给对象键加引号,而是给值加单引号。要重现传统 mongo
Shell 的输出(此 Shell 将键和字符串值都用双引号括起来),请使用带有 EJSON.stringify() 的
mongosh --eval
。
例如,以下命令会返回test
数据库的sales
集合中的项目,并带有双引号和缩进:
mongosh --eval "EJSON.stringify(db.sales.findOne().toArray(), null, 2)"
输出如下所示:
{ "_id": { "$oid": "64da90c1175f5091debcab26" }, "custId": 345, "purchaseDate": { "$date": "2023-07-04T00:00:00Z" }, "quantity": 4, "cost": { "$numberDecimal": "100.60" } }
数据库调用限制
数据库查询的结果不能在以下上下文中传递:
类构造函数
非异步生成器函数
回调数组上的
.sort()
类中的 JavaScript setter
要访问数据库调用的结果,请使用异步函数、异步生成器函数 或 .map()
。
构造函数
以下构造函数不起作用:
// This code will fail class FindResults { constructor() { this.value = db.students.find(); } } // This code will fail function listEntries() { return db.students.find(); } class FindResults { constructor() { this.value = listEntries(); } }
改用 async
函数:
class FindResults { constructor() { this.value = ( async() => { return db.students.find(); } )(); } }
注意
还可以创建一个在类中执行数据库操作的方法,作为使用异步 JavaScript 的替代方法。
class FindResults { constructor() { } init() { this.value = db.students.find(); } }
要使用此类,请首先构造一个类实例,然后调用 .init()
方法。
生成器函数
以下生成器函数不起作用:
// This code will fail function* FindResults() { yield db.students.findOne(); } // This code will fail function listEntries() { return db.students.findOne(); } function* findResults() { yield listEntries(); }
改用 async generator function
:
function listEntries() { return db.students.findOne(); } async function* findResults() { yield listEntries(); }
数组排序
以下数组排序不起作用:
// This code will fail db.getCollectionNames().sort( ( collectionOne, collectionTwo ) => { return db[ collectionOne ].estimatedDocumentCount() - db[ collectionOne ].estimatedDocumentCount() ) } );
改用 .map()
。
db.getCollectionNames().map( collectionName => { return { collectionName, size: db[ collectionName ].estimatedDocumentCount() }; } ).sort( ( collectionOne, collectionTwo ) => { return collectionOne.size - collectionTwo.size; } ).map( collection => collection.collectionName);
这种数组排序方法通常比不支持的等效代码性能更高。
JavaScript Setter
以下 JavaScript setter 不起作用:
// This code will fail class TestClass { value = 1; get property() { return this.value; } // does not work: set property(value) { this.value = db.test.findOne({ value }); } }
命令异常
对于输出包含 { ok: 0 }
的命令,mongosh
会返回一致异常并忽略服务器原始输出。旧版 mongo
shell 会根据每条命令返回不同的输出。
有关详细信息,请参阅运行命令。
shell配置
旧版 mongo
shell使用名为 .mongorc.js
的配置文件。
如果mongosh
在初创企业时找到.mongorc.js
,但没有找到.mongoshrc.js
,则mongosh
不会加载旧版.mongorc.js
文件,并指示您应将.mongorc.js
重命名为.mongoshrc.js
。
有关详细信息,请参阅.mongoshrc
配置文件。
数据类型
MongoDB 使用 BSON 存储数据,其支持 JSON 中没有的其他数据类型。与旧版 mongo
shell 相比,mongosh
shell 对驱动程序的数据类型支持更好。
有关详细信息,请参阅数据类型。
方法
旧版 mongo
shell无法访问权限load()
方法中脚本的文件名或目录。
有关详细信息,请参阅load()。
可重试写入 (Retryable Writes)
默认情况下,可重试写入为:
已在
mongosh
中启用在旧版
mongo
shell 中禁用
要禁用可重试写入,请使用--retryWrites=false
。
有关详细信息,请参阅--retryWrites
。
传统输出
mongosh
shell返回的输出与旧版 mongo
shell不同。 如果您的脚本要求输出格式与传统 mongo
shell类似,请尝试使用EJSON.stringify() 重新格式化 mongosh
输出。
有关详细信息,请参阅旧版tojsononeline()
。
代码片段
对于旧版 mongo
shell ,代码片段的使用方式有所不同。
有关详细信息,请参阅获取代码段的帮助。