与旧版兼容性变更mongo
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
直接连接到 辅助 副本集成员时,如果您指定了以下任一 读取偏好,则可以从此成员读取
要指定读取偏好,您可以使用
在连接到节点时使用
readPreference
连接字符串选项。使用
Mongo.setReadPref()
方法。
当使用 mongosh
直接连接到 辅助 副本集成员时,如果您的读取偏好设置为 primaryPreferred
、secondary
或 secondaryPreferred
,则无需运行 rs.secondaryOk()
。
show
辅助方法
以下 show
辅助方法始终使用 primaryPreferred
读取偏好,即使操作已指定不同的读取偏好
show dbs
显示数据库
显示集合
显示表
在传统的 mongo
shell 中,这些操作使用指定的读取偏好。
写入偏好行为
可重试写入 在 mongosh
中默认启用。在传统的 mongo
shell 中,可重试写入默认禁用。要禁用可重试写入,请使用 --retryWrites=false
。
ObjectId 方法与属性
这些 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 --eval
与 EJSON.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 设置器
以下 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
壳返回每个命令都不同的输出。
有关详细信息,请参阅 运行命令。
Shell 配置
旧的 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,使用代码片段的方式不同。
有关详细信息,请参阅代码片段的帮助信息。