DB

couchbaseで正規表現で特定のkeyを抽出する方法

更新日:

You can't use extrac parameter to view.

viewは静的にインデックスを作るので動的にパラメータは渡せない仕様。それだったらN1QLを検討すべきです。というかその一択。

https://forums.couchbase.com/t/parameterize-view-couchbase-lite/14984

[java]
view.setMap(new Mapper() {
@Override
public void map(Map<String, Object> document, Emitter emitter) {
if(document.get("type").equals(the_type_of_my_model)) {
emitter.emit(document.get("_id"), null);
}
}
}, "1");
[/java]

[javascript]
function (doc, meta, pattern) {
//var pattern = "^miso.*$";
myregex = new RegExp(pattern);
var match = meta.id.match(myregex);
if (match) {
//emit(match[0], null);
emit(meta.id, null);
}
}
[/javascript]

 

この投稿者も諦めてN1QLを使うと言及している

View と GSI (Global Secondary Index)つまりはN1QLの比較

https://developer.couchbase.com/documentation/server/current/architecture/gsi-versus-views.html

今回は私は、primary indexをregexで検索するためだけに使うので、メモリの最適化などはやらなくて済むと思っているが

必要な場合はこの記事を参考にしたい

 

N1QLの始め方

インデクスが貼れてないと以下のようにエラーが出るので

[bash]
[
{
"code": 4000,
"msg": "No index available on keyspace default that matches your query. Use CREATE INDEX or CREATE PRIMARY INDEX to create an index, or check that your expected index is online.",
"query_from_user": "SELECT Meta(default).id FROM `default` ORDER BY ts DESC LIMIT 100"
}
]
[/bash]

このように最低限のprimary indexをはってみよう

[bash]
CREATE PRIMARY INDEX ON `default`
[/bash]

そして、最後に今回の目的の特定のregexパターンでクエリーを叩いて結果が正しいことを確認してみよう

[bash]
SELECT Meta(default).id FROM `default` WHERE META(`default`).id LIKE "miso%" ORDER BY ts DESC LIMIT 100
[/bash]

 

 


							

-DB

Copyright© CTOを目指す日記 , 2024 All Rights Reserved.