文档菜单
文档首页
/
MongoDB Shell
/

与旧版兼容性变更mongo Shell

本页内容

  • 已弃用方法
  • 读取偏好行为
  • 写入偏好行为
  • ObjectId 方法属性
  • 数值
  • 未定义值
  • 对象引号行为
  • 数据库调用限制
  • 命令异常
  • Shell 配置
  • 数据类型
  • 方法
  • 可重试写入
  • 旧版输出
  • 代码片段

此页描述了 mongosh 和旧版 mongo Shell 之间的差异。除了此处列出的替代方案外,您还可以使用mongocompat片段用于访问过时的mongo shell API。片段是一个实验性功能,更多信息请参见代码片段.

snippet install mongocompat

以下shell方法在mongosh中已弃用。相反,请使用以下列出的方法。替代资源列。

已弃用方法
替代资源
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 直接连接到 辅助 副本集成员时,您必须运行 mongo.setReadPref() 来启用辅助读取。

当使用 mongosh 直接连接到 辅助 副本集成员时,如果您指定了以下任一 读取偏好,则可以从此成员读取

要指定读取偏好,您可以使用

当使用 mongosh 直接连接到 辅助 副本集成员时,如果您的读取偏好设置为 primaryPreferredsecondarysecondaryPreferred,则无需运行 rs.secondaryOk()

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

  • show dbs

  • 显示数据库

  • 显示集合

  • 显示表

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

可重试写入mongosh 中默认启用。在传统的 mongo 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 壳默认将数值存储为 doubles。在 mongosh 中,数字存储为 32 位整数,Int32,或者如果值不能存储为 Int32,则存储为 Double

MongoDB Shell 继续支持在 mongo 壳中支持的数值类型。然而,首选类型已更新,以更好地与 MongoDB 驱动程序 保持一致。有关更多信息,请参阅 mongosh 数据类型

在 MongoDB Shell 中,数值变量的首选类型与旧版 mongo 壳中建议的类型不同。在 mongosh 中,类型更好地与 MongoDB 驱动程序使用的类型相匹配。

mongo 类型
mongosh 类型
NumberInt
Int32
NumberLong
Long
NumberDecimal
Decimal128

警告

如果您同时使用 mongosh 和旧版 mongo 壳连接到同一集合,数据类型可能存储不一致。

提示

另请参阅

有关管理类型的更多信息,请参阅模式验证概述。

未定义的 BSON 类型已被弃用。请参阅。如果你尝试在 mongosh 中插入包含未定义 JS 类型的文档,你的部署将用 BSON null 值替换文档中的未定义值。使用 mongosh 将未定义值插入到数据库中没有任何支持的方式。

例如,考虑在 mongosh 中运行以下代码

db.people.insertOne( { name : "Sally", age : undefined } )

当你将此代码在 mongosh 中运行时,shell 插入以下文档

{ name : "Sally", age : null }

mongosh 将使用其他工具(如 Go 驱动 或遗留的 mongo shell)存储的任何 BSON 未定义值表示为 null。

mongosh 不在输出中引用对象键,并将单引号放在值上。要重现遗留的 mongo shell 的输出,该 shell 将键和字符串值都包裹在双引号中,请使用 mongosh --evalEJSON.stringify().

例如,以下命令以双引号和缩进来返回 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 设置器

要访问数据库调用的结果,请使用 异步函数异步生成器函数,或 .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 设置器无法正常工作

// 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 壳返回每个命令都不同的输出。

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

旧的 mongo 壳使用名为 .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().

有关详细信息,请参阅 Legacy tojsononeline().

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

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

返回

参考

© . All rights reserved.