与旧版 Shell 的兼容性更改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 行为 |
---|---|---|
ObjectId.str | Returns a hexadecimal string: 6419ccfce40afaf9317567b7 | Undefined (Not available) |
ObjectId.valueOf() | Returns the value of ObjectId.str :6419ccfce40afaf9317567b7 | Returns a formatted string: ObjectId("6419ccfce40afaf9317567b7") |
ObjectId.toString() | 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 类型 |
---|---|
NumberInt | Int32 |
NumberLong | Long |
NumberDecimal | Decimal128 |
警告
如果您同时使用 mongosh
和旧版 mongo
shell 连接到同一集合,则数据类型的存储方式可能会不一致。
未定义的值
未定义的BSON类型已弃用。如果您尝试插入在 中具有未定义 JSmongosh
类型的文档,您的部署会将文档中的未定义值替换为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 ,代码片段的使用方式有所不同。
有关详细信息,请参阅获取代码段的帮助。