在这个问题中,我指的是Database commands和JavaScript methods。
我想知道为什么MongoDB对命令和方法有两组不同的操作。首先我虽然这些命令是JavaScript中可用的操作的子集,但后来我意识到有像filemd5这样的命令没有[直接]作为方法可用。
我的问题是为什么命令和方法之间存在区别,以及为什么它们不能简单地是具有不同表示的同一组操作。命令1更适合声明性操作(例如通过REST提供),第二个适用于DB脚本。
答案 0 :(得分:10)
JavaScript methods可以看作是抽象层。许多方法只是数据库命令的包装器。您可以通过仅使用()
编写函数名来内省方法。
示例:
> 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 wire protocol为query
,insert
,update
,delete
,getmore
,{{1}指定了不同的request opcodes等等。
可以使用不同的请求操作码实现命令。但是,MongoDB作者决定在名为killcursors
的特殊集合上将命令实现为常规查询。
$cmd
的内省揭示了它:
runCommand
某些命令内部,并非打算由用户调用。因此,MongoDB shell中没有提供方法来方便地访问这些命令。
一些例子: