可能与此问题有关 Basic GROUP BY statement using OPA MongoDB high level API
我希望能够检索“name”字段值包含给定字符串的文档列表。
这是我的文件清单:
{name: "Charles-Hugo"},
{name: "Jean Pierre"},
{name: "Pierre Dupont"},
我希望只能检索包含“Pierre”字符串的文件:Jean Pierre和Pierre Dupont。
我知道MongoDB高级API无法做到这一点。 我查看了低级API函数,但我不知道在安全的Opa类型中检索文档的最简单方法是什么。
此外,我还想在查询中添加跳过/限制选项。
有什么想法吗?
答案 0 :(得分:2)
Opa中的DbGen自动化机制支持:
DbSet.iterator(/path/data[name =~ pattern])
答案 1 :(得分:2)
正如@Henri所指出的,自提交[enhance] DbGen: add case insensitive regex operator =~ 以来,在Opa中有正则表达式搜索支持非常好。
请注意它正在使用$regex
运算符,而不是全文索引,并且可能会导致性能下降:( MongoDB documentation says $正则表达式运算符以有限的方式使用索引 - 仅用于前缀搜索:pattern ^Jean
。在文本中的任何位置搜索Jean
都需要完全扫描。
就我个人而言,我正在使用Mongo的full-text index功能和Opa的“低级”API来执行$text
命令:
function list({float score, Article.id id}) textSearch(string query) {
function onfailure(failure) {
cat.error("textSearch({{~query}}): {failure}");
[];
}
function onsuccess(success) {
function aux(~{name,value}) {
name == "results";
}
match (List.filter(aux, success)) {
| [] :
// `results` field not found - error
onfailure(success);
| results:
cat.debug("textSearch({~{query}}): {results}");
function ({~score, obj: ~{id}}) {
~{score, id}
}
|> List.map(_, Bson.doc2opa(results) ? []);
}
}
opts = [H.str("search", query), H.doc("project", [H.i32("_id",0), H.i32("id",1)])];
// { search: query, project: {_id:0, id:1}, }
// |> Bson.opa2doc
outcome = MongoCommands.simple_str_command_opts(ll_db, db_name, "text", coll_name, opts);
MongoCommon.outcome_map(outcome, onsuccess, onfailure)
}
Mongo中的功能从2.4开始就是实验性的(你必须通过特殊的配置选项打开它),2.6中的功能是稳定的(默认情况下打开)。