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

时间:2013-03-18 10:11:27

标签: mongodb mongodb-java

在这个问题中,我指的是Database commandsJavaScript methods

我想知道为什么MongoDB对命令和方法有两组不同的操作。首先我虽然这些命令是JavaScript中可用的操作的子集,但后来我意识到有像filemd5这样的命令没有[直接]作为方法可用。

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

1 个答案:

答案 0 :(得分:10)

JavaScript方法

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("---");});
}

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 protocolqueryinsertupdatedeletegetmore,{{1}指定了不同的request opcodes等等。

可以使用不同的请求操作码实现命令。但是,MongoDB作者决定在名为killcursors的特殊集合上将命令实现为常规查询

$cmd的内省揭示了它:

runCommand

内部命令

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

一些例子: