如何在新版Mongo Shell(mongosh)中查看函数源代码
新旧Mongo Shell查看函数源代码的差异
旧版Mongo Shell(mongo):可直接查看完整源码
在旧版mongo Shell中,直接输入函数名称就能查看其完整实现代码,示例如下:
> db.users.find function(query, fields, limit, skip, batchSize, options) { var cursor = new DBQuery(this._mongo, this._db, this, this._fullName, this._massageObject(query), fields, limit, skip, batchSize, options || this.getQueryOptions()); { const session = this.getDB().getSession(); const readPreference = session._getSessionAwareClient().getReadPreference(session); if (readPreference !== null) { cursor.readPref(readPreference.mode, readPreference.tags); } const readConcern = session._getSessionAwareClient().getReadConcern(session); if (readConcern !== null) { cursor.readConcern(readConcern.level); } } return cursor; }
新版Mongo Shell(mongosh):仅能查看函数签名或包装函数
在新版mongosh中,直接查看函数只能得到函数签名及元数据信息,无法获取完整实现:
test> db.users.find [Function: find] AsyncFunction { returnsPromise: true, apiVersions: [ 1, Infinity ], returnType: 'Cursor', serverVersions: [ '0.0.0', '999.999.999' ], topologies: [ 'ReplSet', 'Sharded', 'LoadBalanced', 'Standalone' ], deprecated: false, platforms: [ 'Compass', 'Browser', 'CLI' ], isDirectShellCommand: false, acceptsRawInput: false, shellCommandCompleter: undefined, help: [Function (anonymous)] Help }
即使调用toString()方法,也只能返回一层包装函数,看不到核心实现:
test> db.users.find.toString() function wrapper(...args) { const origResult = orig.call(this, ...args); return (0, helpers_1.addHiddenDataProperty)(origResult, Symbol.for('@@mongosh.syntheticPromise'), true); }
集成mongosh的GUI客户端输出差异
测试多款集成了mongosh的GUI客户端,输出结果各有不同:
- Studio 3T:输出与mongosh原生完全一致
function wrapper(...args) { const origResult = orig.call(this, ...args); return (0, helpers_1.addHiddenDataProperty)(origResult, Symbol.for('@@mongosh.syntheticPromise'), true); }
- MongoDB Compass:变量名做了简化,但核心逻辑与mongosh一致
'function t(...t){ const r=e.call(this,...t); return(0,u.addHiddenDataProperty)(r,Symbol.for("@@mongosh.syntheticPromise"),!0)}'
- NoSQLBooster for MongoDB:差异最大,输出包含查询转换相关逻辑
function () { if ('undefined' !== typeof _transformQuery) { var args = _transformQuery && Object.values(arguments).map(function (it) { if (utils.isArray(it)) { it = it.map(function (x) { return _transformQuery(x) }); return it; } else { return _transformQuery(it); } }); return old.apply(this, args); } else return old.apply(this, arguments) }
内容的提问来源于stack exchange,提问作者Kevin Xiong
相关产品推荐
相关产品推荐

