Запрос кучевой базы путем динамической передачи некоторого значения

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

{
"userEmail": "[email protected]",
"hashedPassword": "$2a$12$MT31FHNEbOAKpQGzLdBB3uhLlPlGNU0cvsgi/2pt4TdwPjvrUzkSG",
"type": "user",
}

Я хочу прочитать только тот документ, который имеет значение userEmail как [email protected]. Для этого я написал диванную базу:

function (doc, meta) {
  if(doc.userEmail == "[email protected]")
      emit(doc.data, meta.id);
}

Теперь я хочу передать значение «[email protected]» из кода Java. Я много пробовал, но не мог найти подходящего решения. Может ли кто-нибудь помочь мне в этой дилемме.

Заранее спасибо за любые предложения.


person Yo Yo Saty Singh    schedule 15.12.2014    source источник


Ответы (2)


Я думаю, что на самом деле вы хотите сопоставить свои документы JSON с помощью userEmail, поэтому ваша функция сопоставления должна быть примерно такой:

function(doc, meta) {
    //maybe check the type of the document here, see meta.type
    emit(doc.userEmail, null)
}

Два примечания:

  • если у вас в корзине есть как документы json, так и не-json, вы можете сопоставить только документы json, отметив meta.type == "json".
  • результирующий индекс всегда будет иметь идентификатор документа, нет необходимости создавать его (или весь документ), поскольку он без необходимости увеличивает размер индекса.

Теперь вы можете запросить представление, передав аргументы startkey и endkey с небольшой хитростью:

?startkey="theEmail"&endkey="theEmail\uefff"

Здесь \uefff — это первый символ Юникода, который позволяет имитировать точное совпадение ключей, поскольку между «myEmail» и «myEmail» нет другой комбинации символов.

person Simon Baslé    schedule 15.12.2014
comment
Большое вам спасибо за вашу помощь. Я ценю. - person Yo Yo Saty Singh; 15.12.2014
comment
Если я хочу получить документы больше некоторого значения (это значение должно быть динамическим из Java), как мне это сделать? - person Sivailango; 14.07.2015
comment
@Sivailango просто используйте startkey (но это будет больше или равно в алфавитном порядке) - person Simon Baslé; 15.07.2015
comment
Я сделал ошибку, нужно использовать специальный символ \uefff (исправлено в ответе) - person Simon Baslé; 15.07.2015
comment
@SimonBaslé Да, ты прав. Другое сомнение в том, что мы должны использовать этот ключ в функции emit. Верно? Если я хочу получить документы со страной=нас, возраст>28 лет, как мне написать emit? emit([doc.country, doc.age], null). Теперь, если установить значение для startkey=28, будет ли оно автоматически применяться к полю возраста? или мы должны установить оба динамических значения в startkey - person Sivailango; 15.07.2015
comment
@Sivailango, вы должны установить оба значения в startkey, но тогда я думаю, что это сделает ›= и для страны ... в этом случае, возможно, используйте ["us", 28] в качестве начального ключа и ["us", 999] в качестве конечного ключа, например ... - person Simon Baslé; 15.07.2015

Вот вопрос к вам. Если у вас есть адрес электронной почты, а адрес электронной почты уникален, или у вас может быть что-то вроде уникального идентификатора пользователя, почему бы не сделать это ключом объекта? Тогда вам вообще не обязательно иметь вид. Ваше приложение знает, что ему нужно, и получает объект по ключу. Это всегда намного быстрее и предпочтительнее использования представления. Просто что-то рассмотреть.

В Couchbase у вас есть 256 байт (iirc) для ключа, поэтому сделайте ключ чем-то значимым для вашего приложения и, возможно, покончите с этим представлением?

person Kirk    schedule 15.12.2014
comment
это действительно было бы лучше - person Simon Baslé; 15.12.2014
comment
Предложение хорошее, ребята, но у меня есть другая логика, чтобы ключи документов на диване были уникальными и безопасными. @simon- извините, у меня недостаточно репутации, чтобы пометить ваш ответ как принятый. :( - person Yo Yo Saty Singh; 15.12.2014
comment
Тогда, возможно, стоит выделить адрес электронной почты в отдельный ключ, если вы собираетесь часто к нему обращаться. Просто кое что для раздумий. Чем больше вы можете получить доступ к объектам по ключу, а не по представлениям, тем выше будет производительность. - person Kirk; 16.12.2014
comment
@kirk - В соответствии с потребностями моего проекта я шифрую UUID и секретный ключ вместе для создания документа CB. - person Yo Yo Saty Singh; 16.12.2014