CouchDB и несколько клавиш - PullRequest
7 голосов
/ 23 августа 2010

Можно ли использовать подобный запрос в CouchDB?Как использовать две клавиши ?

SELECT field FROM table WHERE value1="key1" OR value2="key2"

Я всегда использовал только одну клавишу.

function(doc) {

    emit(doc.title, doc);

}

Спасибо.

Ответы [ 6 ]

4 голосов
/ 10 сентября 2010

В CouchDB 0.9 и выше вы можете POST к представлению (или _all_docs) с телом вроде:

{"keys": ["key1", "key2", ...]}

Чтобы получить набор строк с соответствующими ключами.

0 голосов
/ 21 ноября 2017

Нужно немного расширить ответ Лласрама; индекс должен содержать значения для обоих полей:

function(doc) {
  emit("value1:"+doc.value1); // add check for undefined, null, etc.
  emit("value2:"+doc.value2);
}

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

keys=["value1:key1","value2:key2"]

РЕДАКТИРОВАТЬ: однако, это будет сообщать один и тот же документ несколько раз, если он содержит совпадающие пары значение + ключ.

0 голосов
/ 07 августа 2012

Вы можете создать вид, подобный этому:

function(doc){
    if(doc.value1) emit(doc.value1, doc.field);
    if(doc.value2) emit(doc.value2, doc.field);
}

Затем запросите его, используя предложение llasram для POST к представлению:

{"keys": ["key1", "key2", ...]}

Ваш клиент, однако, должен быть осторожен с дураками. Документ, в котором doc.value1 == "key1" && doc.value2 == "key2" будет отображаться дважды. Просто используйте _id для фильтрации результатов.

0 голосов
/ 16 ноября 2011

Вы можете сделать это (при условии, что вам нужны «динамические параметры»), используя 2 отдельных представления и небольшую обработку на стороне клиента:

У вас будет одно представление для «field1», к которому вы бы запросилисо значением «value1».(получение списка идентификаторов документов)

Затем вы запрашиваете второе представление «field2», передавая значение «value2» и получая другой список идентификаторов документов.

Теперь вам просто нужнонайти «пересечение» 2 списков идентификационных номеров (оставлено в качестве упражнения для читателя)

0 голосов
/ 14 февраля 2011

Я бы добавил это к ответу Дулутиана:

 emit(doc.title, null)

Вы всегда можете извлечь значения "_id" и doc, используя view api.

0 голосов
/ 23 августа 2010

Да. Примерно так должно получиться, если я понимаю твой вопрос:

function(doc) {
  a = (doc.value1 && doc.value1 == "key1");
  b = (doc.value2 && doc.value2 == "key2");
  if (a || b) {
    emit(doc._id,doc.title);
  }
}

Выдает только те документы или значения, которые вам нужны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...