PouchDb извлекает все документы по идентификатору, соответствующему регулярному выражению

Я хотел бы получить все документы с идентификатором, соответствующим выражению регулярного выражения.

Например, у меня есть следующие идентификаторы документов:

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);

    });

});

person sylvain1264    schedule 11.05.2015    source источник
comment
какое регулярное выражение вы используете? можете ли вы предоставить больше информации об этом   -  person Bhavesh Jariwala    schedule 11.05.2015


Ответы (3)


Вам нужно получить все свои документы с помощью allDocs(), а затем отфильтровать в памяти с помощью JavaScript.

Это требует чтения всей вашей базы данных в память, но PouchDB не может индексировать регулярное выражение, так что это то, что вам нужно сделать! В противном случае вы можете создать свои идентификаторы, чтобы упростить поиск префиксов, как описано другим комментатором.

person nlawson    schedule 11.05.2015
comment
Хорошо, спасибо, так что это именно то, что я делаю прямо сейчас. Должен ли я подтверждать такой ответ, который хорош, но не решает мою проблему? - person sylvain1264; 11.05.2015
comment
Мне жаль, что вы считаете, что это не решает вашу проблему. На самом деле, большинство баз данных не позволяют вам индексировать регулярные выражения, поэтому на самом деле, когда вы выполняете поиск по регулярным выражениям (или LIKE запросы в SQL), на самом деле происходит то, что база данных выполняет полное сканирование таблицы, а затем возвращает результаты, которые вы можете сделать сами с такой же плохой производительностью. :) Единственная известная мне база данных, которая может индексировать такие нечеткие запросы, — это Lucene/Solr: blog.mikemccandless.com/2011/03/ - person nlawson; 11.05.2015

это позволяет получить документ по префиксу, например

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

приведенный выше код дает вам весь документ, _id которого начинается с p0.

ссылка https://github.com/nolanlawson/pouchdb-quick-search#autosuggestions-and-prefix-search

person Bhavesh Jariwala    schedule 11.05.2015
comment
Этот код получит p0 и p0/e0, это не то, что мне нужно. - person sylvain1264; 11.05.2015
comment
Вы можете использовать функцию фильтра, и в ней вы можете определить свою логику. - person Bhavesh Jariwala; 11.05.2015
comment
Я знаю функцию фильтра для репликации, но как ее использовать для извлечения документов? Могу ли я получить все идентификаторы моих документов с помощью include_docs: false, применить фильтр к результату, а затем выполнить второй запрос с параметром соответствия ключей? - person sylvain1264; 11.05.2015
comment
Вы можете использовать функцию allDocs с параметром keys, который принимает массив строк для получения указанных документов за один раз. - person Bhavesh Jariwala; 11.05.2015
comment
Я имею в виду точное соответствие этому регулярному выражению: /^p[0-9]+$/ - person sylvain1264; 11.05.2015

Несколько лет спустя, похоже, 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-find.

Хотя производительность может быть ужасной, я не пробовал. @nlawson, кажется, считает, что регулярное выражение для индекса нельзя сделать быстро, и он, безусловно, знает лучше, чем большинство.

EDIT: я только что проверил документы Pouch, упомянутые выше, и индексы определенно используются в процессе поиска, поэтому производительность может быть в порядке.

person chichilatte    schedule 25.01.2019