【问题标题】:What is the difference between commands and methods in MongoDB?MongoDB中的命令和方法有什么区别?
【发布时间】:2013-03-18 10:11:26
【问题描述】:

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

我想知道为什么 MongoDB 有 2 组不同的命令和方法操作。首先,我认为命令是 JavaScript 中可用操作的子集,但后来我意识到有些命令,例如 filemd5,它们不是 [直接] 可用作方法的。

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

【问题讨论】:

    标签: mongodb mongodb-java


    【解决方案1】:

    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 protocolqueryinsertupdatedeletegetmorekillcursors 等指定不同的request opcodes

    可以使用不同的请求操作码来实现命令。然而,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 中没有提供方便地访问这些命令的方法。

    几个例子:

    【讨论】:

    • 感谢您的回答。但它并没有完全回答我的问题,为什么 all 方法不能表示为命令,反之亦然。例如 db.collection.insert 使用本地调用而不是命令。
    • 我会说这是 MongoDB 作者的设计决定。插入、更新、删除、killCursor 在 MongoDB 有线协议 (docs.mongodb.org/meta-driver/latest/legacy/…) 中有自己的操作码。然而,命令只是对 $cmd 集合的查询。
    • 我明白了。尽管在某些情况下,如果将 CRUD 操作也公开为命令会容易得多。顺便说一句,感谢您提供有线协议的链接!
    猜你喜欢
    • 1970-01-01
    • 2016-08-11
    • 2023-01-26
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 2011-11-23
    • 1970-01-01
    相关资源
    最近更新 更多