在这个问题中,我指的是数据库命令和JavaScript 方法。
我想知道为什么 MongoDB 有 2 组不同的命令和方法操作。首先,我认为命令是 JavaScript 中可用操作的子集,但后来我意识到有些命令(如filemd5)不能 [直接] 用作方法。
我的问题是为什么命令和方法之间存在区别,为什么它们不能简单地是具有不同表示的同一组操作。第一个命令更适合声明式操作(例如通过 REST 可用),第二个命令更适合 DB 脚本。
在这个问题中,我指的是数据库命令和JavaScript 方法。
我想知道为什么 MongoDB 有 2 组不同的命令和方法操作。首先,我认为命令是 JavaScript 中可用操作的子集,但后来我意识到有些命令(如filemd5)不能 [直接] 用作方法。
我的问题是为什么命令和方法之间存在区别,为什么它们不能简单地是具有不同表示的同一组操作。第一个命令更适合声明式操作(例如通过 REST 可用),第二个命令更适合 DB 脚本。
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("---");});
}
像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);
}
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);
}
某些命令是内部命令,不打算由用户调用。因此,MongoDB shell 中没有提供方便地访问这些命令的方法。
几个例子: