MongoDB中的命令和方法有什么区别?

ejb*_*boy 4 mongodb mongodb-java

在这个问题中,我指的是数据库命令JavaScript方法.

我想知道为什么MongoDB对命令和方法有两组不同的操作.首先我虽然这些命令是JavaScript中可用的操作的子集,但后来我意识到有像filemd5这样的命令没有[直接]作为方法可用.

我的问题是为什么命令和方法之间存在区别,以及为什么它们不能简单地是具有不同表示的同一组操作.命令1更适合声明性操作(例如通过REST提供),第二个适用于DB脚本.

Ben*_*gel 10

JavaScript方法

JavaScript方法可以被看作是抽象层.许多方法只是数据库命令的包装器.您可以通过仅编写函数名称来反省方法().

例:

> db.stats
function (scale) {
    return this.runCommand({dbstats:1, scale:scale});
}
Run Code Online (Sandbox Code Playgroud)

某些方法执行多个命令并聚合输出.例:

> db.printCollectionStats
function () {
    var mydb = this;
    this.getCollectionNames().forEach(function (z)      
        {print(z);printjson(mydb.getCollection(z).stats());print("---");});
}
Run Code Online (Sandbox Code Playgroud)

JavaScript方法与数据库命令

一些方法,如find,update,delete不调用命令:

> db.coll.find
function (query, fields, limit, skip) {
    return new DBQuery(this._mongo, this._db, this, this._fullName, this._massageObject(query), fields, limit, skip);
}
Run Code Online (Sandbox Code Playgroud)

MongoDB的有线协议指定不同请求的操作码query,insert,update,delete, getmore,killcursors等.

可以使用不同的请求操作码实现命令.但是,MongoDB作者决定在一个名为的特殊集合上实现命令作为常规查询$cmd.

内省runCommand揭示了它:

> db.runCommand
function (obj) {
    if (typeof obj == "string") {
        var n = {};
        n[obj] = 1;
        obj = n;
    }
    return this.getCollection("$cmd").findOne(obj);
}
Run Code Online (Sandbox Code Playgroud)

内部命令

某些命令是内部的,不打算由用户调用.因此,MongoDB shell中没有提供方法来方便地访问这些命令.

几个例子:

  • 我想说这是MongoDB作者的设计决定.插入,更新,删除,killCursors在MongoDB有线协议中有自己的操作码(http://docs.mongodb.org/meta-driver/latest/legacy/mongodb-wire-protocol/).但是,命令只是对$ cmd集合的查询. (2认同)