我的问题很简单:我想使用OPAlang高级数据库API对MongoDB执行GROUP BY like语句。但我认为这不可能(?)
如果我想执行mongodb $ group操作,我是否一定需要使用低级API(使用stdlib.apis.mongo?)
最后,我可以使用低级API和高级API与MongoDB进行通信吗?
感谢。
答案 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}}]
您需要做的是使用以下类型声明高级数据库集合:
对于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;)