5

この質問では、データベース コマンドJavaScript メソッドについて言及しています。

なぜ MongoDB には、コマンドとメソッドに対して 2 つの異なる操作セットがあるのだろうか。最初に、コマンドは JavaScript で使用可能な操作のサブセットであると考えましたが、その後、メソッドとして [直接] 使用できないfilemd5のようなコマンドがあることに気付きました。

私の質問は、なぜコマンドとメソッドの間に違いがあるのか​​、そしてなぜそれらが異なる表現を持つ同じ一連の操作ではないのかということです。コマンド 1 は宣言型操作 (たとえば、REST 経由で使用可能) に適し、2 番目のコマンドは 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 シェルには、これらのコマンドに便利にアクセスするための方法は提供されていません。

いくつかの例:

于 2013-03-18T11:05:29.623 に答える