2014-11-03 69 views
0

可能與此問題有關 Basic GROUP BY statement using OPA MongoDB high level APIMongoDB:在文檔字段中執行文本搜索(使用高級API)

我希望能夠檢索「name」字段值包含給定字符串的文檔列表。

這裏是我的文件清單:

{name: "Charles-Hugo"}, {name: "Jean Pierre"}, {name: "Pierre Dupont"},

我希望能夠只檢索其名稱中包含「皮埃爾」字符串的文件:讓·皮埃爾,皮埃爾杜邦。

我知道這是MongoDB高級API無法實現的。 我已經查看了低級別的API函數,但我不知道以安全Opa類型檢索文檔的最簡單方法是什麼。

另外我想爲我的查詢添加跳過/限制選項。

有什麼想法?

+0

我不知道任何關於Opa,但這可能會幫助你http://stackoverflow.com/questions/3305561/how-to-query-mongodb-with-like – ccheneson 2014-11-03 15:58:45

+0

謝謝,但我知道如何執行這個查詢與Mongo貝殼。 Opa語言更復雜一點。 – gogson 2014-11-03 16:05:10

回答

2

在OPA的DBGEN自動化機制支持這個功能:

DbSet.iterator(/path/data[name =~ pattern]) 
+0

謝謝!我沒有在文檔/書中看到它!現在我在源代碼中找到它了)([parser_path.trx](https://github.com/MLstate/opalang/blob/master/compiler/opalang/classic_syntax/parser_path.trx)和[pass_MongoAccessGeneration.ml]( https://github.com/MLstate/opalang/blob/c9358f8f5648164515f1fe0e651ce0c1aa1e7a2e/compiler/opa/pass_MongoAccessGeneration.ml)文件) – gogson 2014-11-03 23:46:14

2

由於@Henri指出存在OPA的正則表達式搜索的支持,因爲犯[enhance] DbGen: add case insensitive regex operator =~什麼是非常好的。

記住,它是利用$regex運營商,而不是全文索引,並可能導致一些性能損失:(由於MongoDB documentation says $正則表達式運算符使用索引在有限的方式 - 只爲前綴搜索:模式^Jean搜索Jean在任何地方文本將需要全掃描

就個人而言,我使用蒙戈的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版中保持穩定(默認打開)。

+0

謝謝Marcin。我們可能會綁定'$ text'命令。如果您想按照您提到的提交的方式提交拉取請求,我們會很樂意接受。 – Henri 2014-11-10 13:46:57

+0

我仍然沒有將我的數據庫遷移到版本2.6。我的應用程序中的索引存在一些問題。在添加了一些索引之後(在2.4中),查詢以不同的方式被解釋,並且返回的文檔數目的限制不再起作用。它可能與MongoDB對多鍵索引的限制有關。奇怪的是,將數據庫與2.4配合使用的方式在2.6中的行爲方式(沒有附加索引)。當我解決這個問題時,我將從當前的'text'命令(2.6中不贊成使用)將應用程序遷移到'$ text'查詢運算符(自2.6開始可用)。 – 2014-11-24 16:04:49