Docs 菜单
Docs 主页
/
MongoDB Shell
/

与旧版 Shell 的兼容性更改mongoshell

在此页面上

  • 已弃用的方法
  • 读取偏好行为
  • 写入偏好行为
  • 对象标识符(ObjectId)方法和属性
  • Numeric Values
  • 未定义的值
  • 对象引用行为
  • 数据库调用限制
  • 命令异常
  • shell配置
  • 数据类型
  • 方法
  • 可重试写入 (Retryable Writes)
  • 传统输出
  • 代码片段

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

snippet install mongocompat

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

已弃用的方法
替代资源
db.collection.copyTo()
聚合阶段 $out
db.collection.count()
db.collection.insert()
db.collection.remove()
db.collection.save()
db.collection.update()
DBQuery.shellBatchSize
Mongo.getSecondaryOk
Mongo.isCausalConsistency
Mongo.setSecondaryOk
rs.secondaryOk
不再需要。请参阅从节点上的读取操作

使用传统mongo shell直接连接从从节点(secondary node from replica set)副本集成员时,必须运行mongo.setReadPref() 以启用从从节点(secondary node from replica set)读取。

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

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

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

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

  • show dbs

  • show databases

  • show collections

  • show tables

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

mongosh 中默认启用可重试写入。旧版 mongo shell 中默认禁用可重试写入。要禁用可重试写入功能,请使用 --retryWrites=false

这些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

默认情况下,传统 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 中没有的其他数据类型。与旧版 mongo shell 相比,mongosh shell 对驱动程序的数据类型支持更好。

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

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

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

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

  • 已启用 mongosh

  • 在旧版 mongo shell 中禁用

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

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

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

有关详细信息,请参阅旧版tojsononeline()

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

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

后退

参考