mongodb操作:利用javaScript封裝db.collection.find()後可呼叫函式原始碼解讀

凌.風發表於2015-01-19
{
	"_mongo" : connection to YOURIP:27017{ SSL: { sslSupport: false, sslPEMKeyFile: "" } }{ SSH: { host: "", port: 22, user: "", password: "", publicKey: { publicKey: "", privateKey: "", passphrase: "" }, currentMethod: 0 } },
	"_db" : mazhan_log,
	"_collection" : YOURCOLLECTION,
	"_ns" : "YOURCOLLECTION",
	"_query" : {
		
	},
	"_fields" : null,
	"_limit" : 0,
	"_skip" : 0,
	"_batchSize" : 0,
	"_options" : 0,
	"_cursor" : {
		
	},
	"_numReturned" : 50,
	"_special" : false,
	"_cursorSeen" : 50,
	"help" : function () {
    print("find() modifiers");
    print("\t.sort( {...} )");
    print("\t.limit( n )");
    print("\t.skip( n )");
    print("\t.count() - total # of objects matching query, ignores skip,limit");
    print("\t.size() - total # of objects cursor would return, honors skip,limit");
    print("\t.explain([verbose])");
    print("\t.hint(...)");
    print("\t.addOption(n) - adds op_query options -- see wire protocol");
    print("\t._addSpecial(name, value) - http://dochub.mongodb.org/core/advancedqueries#AdvancedQueries-Metaqueryoperators");
    print("\t.batchSize(n) - sets the number of docs to return per getMore");
    print("\t.showDiskLoc() - adds a $diskLoc field to each returned object");
    print("\t.min(idxDoc)");
    print("\t.max(idxDoc)");
    print("\nCursor methods");
    print("\t.toArray() - iterates through docs and returns an array of the results");
    print("\t.forEach( func )");
    print("\t.map( func )");
    print("\t.hasNext()");
    print("\t.next()");
    print("\t.objsLeftInBatch() - returns count of docs left in current batch (when exhausted, a new getMore will be issued)");
    print("\t.count(applySkipLimit) - runs command at server");
    print("\t.itcount() - iterates through documents and counts them");
},
	"clone" : function () {
    var q = new DBQuery(this._mongo, this._db, this._collection, this._ns, this._query, this._fields, this._limit, this._skip, this._batchSize, this._options);
    q._special = this._special;
    return q;
},
	"_ensureSpecial" : function () {
    if (this._special) {
        return;
    }
    var n = {query:this._query};
    this._query = n;
    this._special = true;
},
	"_checkModify" : function () {
    if (this._cursor) {
        throw "query already executed";
    }
},
	"_exec" : function () {
    if (!this._cursor) {
        assert.eq(0, this._numReturned);
        this._cursor = this._mongo.find(this._ns, this._query, this._fields, this._limit, this._skip, this._batchSize, this._options);
        this._cursorSeen = 0;
    }
    return this._cursor;
},
	"limit" : function (limit) {
    this._checkModify();
    this._limit = limit;
    return this;
},
	"batchSize" : function (batchSize) {
    this._checkModify();
    this._batchSize = batchSize;
    return this;
},
	"addOption" : function (option) {
    this._options |= option;
    return this;
},
	"skip" : function (skip) {
    this._checkModify();
    this._skip = skip;
    return this;
},
	"hasNext" : function () {
    this._exec();
    if (this._limit > 0 && this._cursorSeen >= this._limit) {
        return false;
    }
    var o = this._cursor.hasNext();
    return o;
},
	"next" : function () {
    this._exec();
    var o = this._cursor.hasNext();
    if (o) {
        this._cursorSeen++;
    } else {
        throw "error hasNext: " + o;
    }
    var ret = this._cursor.next();
    if (ret.$err && this._numReturned == 0 && !this.hasNext()) {
        throw "error: " + tojson(ret);
    }
    this._numReturned++;
    return ret;
},
	"objsLeftInBatch" : function () {
    this._exec();
    var ret = this._cursor.objsLeftInBatch();
    if (ret.$err) {
        throw "error: " + tojson(ret);
    }
    return ret;
},
	"readOnly" : function () {
    this._exec();
    this._cursor.readOnly();
    return this;
},
	"toArray" : function () {
    if (this._arr) {
        return this._arr;
    }
    var a = [];
    while (this.hasNext()) {
        a.push(this.next());
    }
    this._arr = a;
    return a;
},
	"count" : function (applySkipLimit) {
    var cmd = {count:this._collection.getName()};
    if (this._query) {
        if (this._special) {
            cmd.query = this._query.query;
        } else {
            cmd.query = this._query;
        }
    }
    cmd.fields = this._fields || {};
    if (applySkipLimit) {
        if (this._limit) {
            cmd.limit = this._limit;
        }
        if (this._skip) {
            cmd.skip = this._skip;
        }
    }
    var res = this._db.runCommand(cmd);
    if (res && res.n != null) {
        return res.n;
    }
    throw "count failed: " + tojson(res);
},
	"size" : function () {
    return this.count(true);
},
	"countReturn" : function () {
    var c = this.count();
    if (this._skip) {
        c = c - this._skip;
    }
    if (this._limit > 0 && this._limit < c) {
        return this._limit;
    }
    return c;
},
	"itcount" : function () {
    var num = 0;
    while (this.hasNext()) {
        num++;
        this.next();
    }
    return num;
},
	"length" : function () {
    return this.toArray().length;
},
	"_addSpecial" : function (name, value) {
    this._ensureSpecial();
    this._query[name] = value;
    return this;
},
	"sort" : function (sortBy) {
    return this._addSpecial("orderby", sortBy);
},
	"hint" : function (hint) {
    return this._addSpecial("$hint", hint);
},
	"min" : function (min) {
    return this._addSpecial("$min", min);
},
	"max" : function (max) {
    return this._addSpecial("$max", max);
},
	"showDiskLoc" : function () {
    return this._addSpecial("$showDiskLoc", true);
},
	"readPref" : function (mode, tagSet) {
    var readPrefObj = {mode:mode};
    if (tagSet) {
        readPrefObj.tags = tagSet;
    }
    return this._addSpecial("$readPreference", readPrefObj);
},
	"forEach" : function (func) {
    while (this.hasNext()) {
        func(this.next());
    }
},
	"map" : function (func) {
    var a = [];
    while (this.hasNext()) {
        a.push(func(this.next()));
    }
    return a;
},
	"arrayAccess" : function (idx) {
    return this.toArray()[idx];
},
	"comment" : function (comment) {
    var n = this.clone();
    n._ensureSpecial();
    n._addSpecial("$comment", comment);
    return this.next();
},
	"explain" : function (verbose) {
    var n = this.clone();
    n._ensureSpecial();
    n._query.$explain = true;
    n._limit = Math.abs(n._limit) * -1;
    var e = n.next();

    function cleanup(obj) {
        if (typeof obj != "object") {
            return;
        }
        delete obj.allPlans;
        delete obj.oldPlan;
        if (typeof obj.length == "number") {
            for (var i = 0; i < obj.length; i++) {
                cleanup(obj[i]);
            }
        }
        if (obj.shards) {
            for (var key in obj.shards) {
                cleanup(obj.shards[key]);
            }
        }
        if (obj.clauses) {
            cleanup(obj.clauses);
        }
    }

    if (!verbose) {
        cleanup(e);
    }
    return e;
},
	"snapshot" : function () {
    this._ensureSpecial();
    this._query.$snapshot = true;
    return this;
},
	"pretty" : function () {
    this._prettyShell = true;
    return this;
},
	"shellPrint" : function () {
    try {
        var start = (new Date).getTime();
        var n = 0;
        while (this.hasNext() && n < DBQuery.shellBatchSize) {
            var s = this.next();
            print(s);
            n++;
        }
        if (typeof _verboseShell !== "undefined" && _verboseShell) {
            var time = (new Date).getTime() - start;
            print("Fetched " + n + " record(s) in " + time + "ms");
        }
        if (this.hasNext()) {
            ___it___ = this;
        } else {
            ___it___ = null;
        }
    } catch (e) {
        print(e);
    }
},
	"toString" : function () {
    return "DBQuery: " + this._ns + " -> " + tojson(this._query);
}
}

 

先帶原始碼裸奔, 解讀註釋部分隨後補充。

其實js程式碼很好讀的,嘿嘿!!!

 

相關文章