Mongodb源码分析之查询请求(三)

本文深入探讨MongoDB的查询请求,从客户端的mongo/shell/dbshell.cpp开始,经过DBClientConnection::query和_msgassembleInit,分析了消息结构和请求类型。在服务端,重点在于mongod的db.cpp中的MyMessageHandler::process,如何处理查询请求,包括数据库的读取和用户认证。通过ReadContext和_checkNsAccess理解数据加载和权限检查的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查询部分:

  1. mongo客户端的请求
  2. mongod配置服务器端对数据库的加载
  3. mongod query中cursor操作
  4. mongod对于document的匹配

mongo端的请求:
在这里插入图片描述

首先进入mongo的查询请求部分:将请求分装成一个Message结构,然后将其发送到服务端,等待服务端的相应数据,取得数据最后显示结果.

下面来看具体流程分析:

当我们点击db.coll.find({x:1})时,首先来到了mongo/shell/dbshell.cpp

        if ( ! wascmd ) {
            try {
                if ( scope->exec( code.c_str() , "(shell)" , false , true , false ) )//执行相应的javascript代码
                    scope->exec( "shellPrintHelper( __lastres__ );" , "(shell2)" , true , true , false );
            }
            catch ( std::exception& e ) {
                cout << "error:" << e.what() << endl;
            }
        }

下面进入javascript代码,其在mongo/shell/collection.js.

  //这里因为我们只设置了query,所以其它选项都是空的, 						 
  //this.getQueryOptions()目前只有一个SlaveOK的option,在replset模式下是不能查询secondary服务器的,需要调用rs.SlaveOK()之后才能对secondary进行查询,其执行SlaveOK后每次查询时都会添加一个QueryOption.
	DBCollection.prototype.find = function (query, fields, limit, skip, batchSize, options) {
		    return new DBQuery( this._mongo , this._db , this ,
		                        this._fullName , this._massageObject( query ) , fields , limit , skip , batchSize , options || this.getQueryOptions() );
		}

那么我们继续前进来到DBClientConnection::query函数,该函数只是简单调用了DBClientBase::query函数.

auto_ptr<DBClientCursor> DBClientBase::query(const string &ns, Query query, int nToReturn,
        int nToSkip, const BSONObj *fieldsToReturn, int queryOptions , int batchSize ) {
    auto_ptr<DBClientCursor> c( new DBClientCursor( this,//根据传入的参数创建一个DBClientCursor对象
                                ns, query.obj, nToReturn, nToSkip,
                                fieldsToR
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值