对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

与旧版 mongo Shell 的兼容性更改

本页介绍了mongosh 和旧版mongo Shell之间的差异。除了此处列出的替代方案之外,您还可以使用 mongocompat 代码段访问权限旧版mongo Shell API。代码片段是一项实验性功能,有关更多信息,请参阅代码片段。

snippet install mongocompat

mongosh 中已弃用以下 Shell 方法。请改用 Alternative Resources 列中列出的方法。

使用旧版 mongo shell 直接连接 辅助 副本集成员时,您必须运行 mongo.setReadPref(),启用辅助读取。

使用 mongosh 直接连接到从副本集节点时,如果将读取偏好指定为以下任一选项,则可从该节点读取:

要指定读取偏好,您可以使用以下任一项:

使用mongosh 直接连接到从节点(secondary node from replica set)副本集成员时,如果您的读取偏好(read preference)设立为primaryPreferred 、secondary 或secondaryPreferred ,则无需运行rs.secondaryOk() 。

即使已为操作指定了不同的读取偏好,以下 show 助手方法始终使用读取偏好 primaryPreferred:

  • show dbs

  • show databases

  • show collections

  • show tables

在旧版 mongo shell 中,这些操作使用指定的读取偏好。

mongoshmongo默认下,在 中启用可重试写入。在旧版 Shell中,可重试写入默认处于禁用默认。要禁用可重试写入,请使用--retryWrites=false 。

这些 ObjectId() 方法在mongosh 中的工作方式与在旧版mongo Shell中的工作方式不同。

方法或属性
mongo 行为
mongosh 行为

ObjectId.str

返回十六进制字符串:
6419ccfce40afaf9317567b7


未定义(不可用)

ObjectId.valueOf()

返回ObjectId.str 的值:
6419ccfce40afaf9317567b7

返回格式化字符串:
ObjectId("6419ccfce40afaf9317567b7")

ObjectId.toString()

返回格式化字符串:
ObjectId("6419ccfce40afaf9317567b7")

返回十六进制格式的字符串:
6419ccfce40afaf9317567b7

默认情况下,传统 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驱动程序或传统 mongoShell)存储为 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 不起作用:

// 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 会根据每条命令返回不同的输出。

有关详细信息,请参阅运行命令。

旧版 mongo shell使用名为 .mongorc.js 的配置文件。

如果mongosh在初创企业时找到.mongorc.js ,但没有找到.mongoshrc.js ,则mongosh不会加载旧版.mongorc.js文件,并指示您应将.mongorc.js重命名为.mongoshrc.js 。

有关详细信息,请参阅.mongoshrc配置文件。

MongoDB使用BSON存储数据,这支持JSON中不提供的其他数据类型。与传统的 mongoshmongoShell相比, Shell为驱动程序提供了更好的数据类型支持。

有关详细信息,请参阅数据类型。

旧版 mongo shell无法访问权限load() 方法中脚本的文件名或目录。

有关详细信息,请参阅load()。

默认情况下,可重试写入为:

  • 已启用 mongosh

  • 在旧版 mongo shell 中禁用

要禁用可重试写入,请使用--retryWrites=false 。

有关详细信息,请参阅--retryWrites。

mongosh shell返回的输出与旧版 mongo shell不同。 如果您的脚本要求输出格式与传统 mongo shell类似,请尝试使用EJSON.stringify() 重新格式化 mongosh 输出。

有关详细信息,请参阅 jsononeline() 的传统。

对于旧版 mongo shell ,代码片段的使用方式有所不同。

有关详细信息,请参阅获取代码段的帮助。