5

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

我想知道为什么 MongoDB 有 2 组不同的命令和方法操作。首先,我认为命令是 JavaScript 中可用操作的子集,但后来我意识到有些命令(如filemd5)不能 [直接] 用作方法。

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

4

1 回答 1

10

JavaScript 方法

JavaScript 方法可以看作是抽象层。许多方法只是数据库命令的包装器。您可以通过仅编写不带().

例子:

> db.stats
function (scale) {
    return this.runCommand({dbstats:1, scale:scale});
}

一些方法执行多个命令并聚合输出。例子:

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

JavaScript 方法与数据库命令

find,updatedelete一些方法不调用命令

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

MongoDB 有线协议为, , , , 等指定不同的请求操作码queryinsertupdatedeletegetmorekillcursors

命令可以使用不同的请求操作码来实现。然而, MongoDB作者决定将命令实现为对一个名为$cmd.

的内省runCommand揭示了它:

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

内部命令

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

几个例子:

于 2013-03-18T11:05:29.623 回答