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

5
在这个问题中,我指的是数据库命令JavaScript方法
我想知道为什么MongoDB有两个不同的操作集用于命令和方法。起初,我认为命令是JavaScript可用操作的子集,但后来我意识到,有像filemd5这样的命令并不直接作为方法可用。
我的问题是为什么要区分命令和方法,它们为什么不能简单地成为具有不同表示的相同操作集。命令更适合声明性操作(例如通过REST可用),而第二个则适用于DB脚本。
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方法与数据库命令的区别

一些方法(例如findupdatedelete等)并不调用命令

> 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 wire protocol 定义了不同的请求操作码(request opcodes),如 query, insert, update, delete, getmore, killcursors 等。

命令可以使用不同的请求操作码来实现。然而,MongoDB 的作者决定将命令作为对一个特殊集合(称为 $cmd)的常规查询(regular queries)来实现。

runCommand 的内省揭示了它的实现方式:

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

内部命令

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

以下是一些示例:


谢谢您的答复。但它并没有完全回答我的问题,即为什么 所有 方法不能表示为命令或反之亦然。例如,db.collection.insert 使用本地调用而不是命令。 - ejboy
2
我认为这是MongoDB作者的设计决策。在MongoDB的Wire协议中,插入、更新、删除和killCursors都有自己的操作码(http://docs.mongodb.org/meta-driver/latest/legacy/mongodb-wire-protocol/)。然而,命令只是对$cmd集合的查询。 - Benedikt Waldvogel
我明白了。虽然在某些情况下,如果CRUD操作也可以作为命令公开,那将会更加容易。顺便说一句,感谢提供线路协议的链接! - ejboy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接