You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在新版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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 01:55:23