Как я могу использовать оператор ИЛИ в CouchDB? - PullRequest
0 голосов
/ 01 июня 2018

Мне нужно получить документ, где созданBy = userId или updatedBy = userId.У меня есть следующий функционал карты в CouchDB:

function (doc) {
                        if (doc.$doctype === 'Records') {
                            emit([doc.createdBy, doc.updatedBy], doc);
                        }
                    }

И серверная часть node.js

getData: async (userId) => {
        return await adapter.getRows(
            'Records', 'url',
            {
                startkey: [userId, userId],
                endkey: [userId],
            }
        );
    }

, но он работает как оператор AND.Пожалуйста, помогите мне найти ошибку.

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Я бы сделал это следующим образом:

function (doc) {
   if (doc.$doctype === 'Records') {
       emit(doc.createdBy, "created");
       emit(doc.updatedBy, "updated");
   }
}

тогда вы можете запросить, используя один ключ userID, значение - дополнительная информация о действии, если это необходимо, в противном случае вы можете просто оставить егоnil.

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

include_docs

параметры запроса.

0 голосов
/ 01 июня 2018

Насколько я понимаю, вы не можете выполнить ИЛИ из одного запроса.

(Начиная с CouchDB 2.1, конечная точка _queries еще не доступна. Вв будущем вы сможете запрашивать несколько запросов в одном и том же HTTP-запросе.)

Используя синтаксис startkey и endkey, OR будет эквивалентен:

createBy

  • startKey = [Джон]
  • endkey = [Джон, {}]

updatedBy

  • startKey = [null, john]

  • endkey = [{}, john]

Тогда,Вы могли бы сделать объединение двух наборов результатов.

Если вы используете CouchDB 2.X, вам следует использовать селектор Mango с оператором $ или .

Другое решение

Вы можете создатьконкретное представление для этого запроса.

Например, вы должны проиндексировать как updatedBy, так и созданный By.

if (doc.$doctype === 'Records') {
   emit([doc.createdBy, doc.createdAt]);
   emit([doc.updatedBy, doc.createdAt]);
}

Затем вы можете запросить его с помощью startkey=[author]&endkey=[author,{}]

...