使用OPA MongoDB高级API的基本GROUP BY语句

时间:2013-09-02 11:07:16

标签: mongodb opa

我的问题很简单:我想使用OPAlang高级数据库API对MongoDB执行GROUP BY like语句。但我认为这不可能(?)

如果我想执行mongodb $ group操作,我是否一定需要使用低级API(使用stdlib.apis.mongo?)

最后,我可以使用低级API和高级API与MongoDB进行通信吗?

感谢。

2 个答案:

答案 0 :(得分:1)

考虑到最新发布的Opa编译器代码,我担心不支持聚合:(请参阅the thread in Opa forum。另请注意Quentin关于使用低级和高级API的评论:

  

"您可以将此[低级别]库和内置[高级别]库一起使用,[...]"

请参阅this thread中来自MLstate的人员的自动增量实施建议。注意高级DB字段/next_id定义和初始化,低级读取和增量。

答案 1 :(得分:0)

我只是有不同的想法。

可以使用名为$cmd的虚拟集合访问所有MongoDB命令(例如,您正在使用的“group”命令)。您只需要服务器找到文档{command_name: command_parameter, additional: "options", are: ["listed", "here"]}。您应该能够使用单一查找查询来使用MongoDB服务器的所有功能,而Opa API尚不支持。这包括2.2版中引入的聚合框架以及自2.4版以来仍处于测试阶段的全文搜索。

例如,我想使用新的text命令在全文索引中搜索collecion coll_name查询字符串query。我目前正在使用代码(其中oncuccess是解析答案的函数并获取找到的文档的id - ):

{ search: query, project: {_id:0, id:1}, }
|> Bson.opa2doc
|> MongoCommands.simple_str_command_opts(ll_db, db_name, "text", coll_name, opts)
|> MongoCommon.outcome_map(_, onsuccess, onfailure)

如果您查看API的源代码,simple_str_command_opts将实现为Mongo的findOne()

但我可以使用高级数据库支持:

/test/`$cmd`[{text: coll_name, search: query, project: {_id: 0, id: 1}}]

您需要做的是使用以下类型声明高级数据库集合:

  1. 用于进行查询的所有字段
  2. 您可以获得的所有字段。
  3. 对于text命令:

    type commands = {
      // command
      string text,
    
      // query
      string search,
      {
        int _id,
        int id,
      } project,
    
      // result of executing command "text"
      string queryDebugString,
      string language,
      list({
          float score,
          {int id} obj,
        }) results,
      {
        int nscanned,
        int nscannedObjects,
        int n,
        int nfound,
        int timeMicros,
      } stats,
      int ok,
      // in case of failure (`ok: 0`)
      string errmsg,
    }
    

    不幸的是,无效:在应用程序启动期间,Opa运行时数据库支持尝试为集合的主键创建唯一索引(以下示例{{1 }}):

    {text, search, project}

    使用主键是必要的,因为您必须使用database test { article /article[{id}] commands /`$cmd`[{text, search, project}] } ,而不是findOne()。不允许为虚拟集合find()创建索引,并且数据库初始化失败。

    如果你找到阻止Opa创建索引的方法,你将能够使用Mongo的所有花哨功能而不再使用高级API;)