2014-12-15 4 views
4

Я имеющий couchbase документы, хранящиеся в формате ниже:couchbase Запрашивание, передавая некоторое значение динамически

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

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

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

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

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

ответ

7

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

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

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

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

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

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

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

+0

Большое вам спасибо за помощь. Я ценю. –

+0

Если я хочу получить документы больше некоторого значения (это значение должно быть динамическим с Java), как это сделать? – Sivailango

+1

@Sivailango просто используйте 'startkey' (но он будет больше или равен, в алфавитном порядке) –

2

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

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

+0

это действительно было бы лучше –

+0

Предложение хорошее, ребята, но у меня есть другая логика для ключей документа couchbase, чтобы сделать уникальным и безопасным. @ simon- Мне очень жаль, что у меня недостаточно репутации, чтобы отметить ваш ответ как принятый. :( –

+0

Тогда, возможно, стоит разбить адрес электронной почты на отдельный ключ, если это то, к чему вы часто обращаетесь. Просто подумайте. Чем больше вы можете получить доступ к объектам по ключу, но не по видам, более высокая производительность. – Kirk

 Смежные вопросы

  • Нет связанных вопросов^_^