MongoDB:在文档字段中执行文本搜索(使用高级API)

时间:2014-11-03 15:52:30

标签: mongodb opa

可能与此问题有关 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类型中检索文档的最简单方法是什么。

此外,我还想在查询中添加跳过/限制选项。

有什么想法吗?

2 个答案:

答案 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中的功能是稳定的(默认情况下打开)。