PouchDb通过Id匹配正则表达式获取所有文档

时间:2015-05-11 09:21:26

标签: javascript pouchdb

我想获取id与正则表达式匹配的所有文档。

例如,我有以下文档ID:

p0
p0/e0
p1
p1/e0

我怎样才能得到p0和p1?正则表达式将是/ ^ p [0-9] + $ /

目前我可以执行两个请求,但我只想使用一个:

This.db.allDocs({
    include_docs: false
}).then(function(result){

    // Find all ids matching /^p[0-9]+$/
    var iDoc = result.rows.length;
    while(iDoc--){
        if(result.rows[iDoc].id.match(/^p[0-9]+$/)){
            projectsIds.push(result.rows[iDoc].id);
        }
    }

    // Get all documents with ids matching /^p[0-9]+$/
    This.db.allDocs({
        include_docs: true,
        keys: projectsIds
    }).then(function(result) {
        var iProject = result.rows.length;
        var docs = [];
        while (iProject--) {
            docs[iProject] = result.rows[iProject].doc;
        }
        projects.resolve(docs);

    });

});

3 个答案:

答案 0 :(得分:4)

这可以通过前缀来获取文件 示例

localDB.allDocs({
            include_docs: true,
            startkey: "p0",
            endkey: "p0\uffff"
        },...);

上面的代码为您提供_id以p0开头的所有文档。

参考链接 https://github.com/nolanlawson/pouchdb-quick-search#autosuggestions-and-prefix-search

答案 1 :(得分:1)

您需要使用allDocs()获取所有文档,然后使用JavaScript在内存中进行过滤。

这需要将整个数据库读入内存,但PouchDB无法在正则表达式上编制索引,因此您需要做的就是这样!否则,您可以设计您的ID,以便按照其他评论者的描述更容易进行前缀搜索。

答案 2 :(得分:0)

几年后,看来pouchdb-find插件可能有所帮助(我想由@nlawson编写)。这是有关使用它进行查询的Pouch文档... https://pouchdb.com/api.html#query_index

以及您将如何做:

async test()
  let result = await This.db.find({
    selector: {_id: {$regex: '^p[0-9]+$'}}
  });
  let docs = result.rows.map( row => row.doc )
  console.dir(docs)
}

(我使它异步,所以您不必费心使用回调)

您可以在pouchdb查找插件的site上自己尝试一下。

虽然性能可能很糟糕,但我还没有尝试过。 @nlawson似乎认为索引上的正则表达式不能很快完成,他肯定比大多数人都了解。

编辑:我刚刚检查了上面提到的Pouch文档,并且在查找过程中肯定使用了索引,因此性能可能还可以。