Получение документов на основе атрибута в CouchDB (с использованием PHP и Cloudant)

Можно ли получить документ на основе атрибута этого документа?

Я хочу иметь возможность проверить мой users при регистрации, существует ли электронная почта или нет? Однако мне кажется, что вы можете получить документы только _id...

Я использую Cloudant в качестве облачного сервиса, использующего CouchDB.


person Adam Carter    schedule 04.11.2012    source источник
comment
P.S. Я понимаю, что есть способ получить все документы в базе данных, но я не хочу получать все документы и циклически просматривать их, если это возможно.   -  person Adam Carter    schedule 04.11.2012


Ответы (1)


Вы можете использовать адрес электронной почты в качестве идентификатора документа, чтобы нельзя было добавить другой документ с таким же адресом электронной почты. Вы также можете использовать важную функцию CouchDB, представление, чтобы проверить, почта существует до вставки. Оба метода требуют последующего разрешения конфликтов. В первом случае может существовать другой узел Couch с конфликтующим документом, который еще предстоит реплицировать. Во втором случае два пользователя могут добавить учетные записи на один и тот же сервер, но оба сначала проверят существующие электронные письма, а затем оба добавят свои учетные записи.

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

function (doc) {
  if (!doc.email) return;
  emit(doc.email, doc);
}

Вы можете запросить представление с помощью:

http://localhost:5984/YOUR_DTABASE/_design/YOUR_DESIGN_DOCUMENT/_view/YOUR_VIEW?key='[email protected]'

Обратите внимание, что сравнение электронной почты не так тривиально, как можно было бы ожидать:

  1. Имя домена DNS (после «@») нечувствительно к регистру (имя пользователя обычно чувствительно к регистру)
  2. В обычной системе электронной почты вы можете назначать псевдонимы.
  3. Некоторые системы электронной почты позволяют встраивать папки назначения и дополнительную информацию, которая изменяет строку адреса электронной почты, но направляет на тот же ящик (например, ящик+папка@домен.com).
  4. Gmail игнорирует «.», поэтому [email protected] равно [email protected].
person Marcin Skórzewski    schedule 04.11.2012
comment
Хорошо, кажется, мне нужно использовать библиотеку JQuery - это может показаться глупым, но я нигде не могу ее найти - у вас есть прямая ссылка для скачивания? - person Adam Carter; 04.11.2012
comment
Вы можете скачать jQuery с его домашней страницы. Это как-то связано с этим вопросом про CouchDB, потому что я не знаю, как jQuery может помочь вам с запросом базы данных? - person Marcin Skórzewski; 05.11.2012
comment
Хм, кажется, я сам запутался. Верно ли, что при использовании функции карты вы сохраняете документ в базе данных, используя формат, подобный этому: { _id: _design/application, _rev: 1-C1687D17, views: { viewname: { map: function(doc ) { ... }, уменьшите: function(keys, values) { ... } } } }, затем прочитайте его по адресу: /database/_design/application/_view/viewname - person Adam Carter; 05.11.2012
comment
По сути, представление похоже на представление SQL. Он вычисляет таблицу из другой таблицы. Вы создаете проектный документ с некоторыми функциями. Функция map запускается для каждого документа в БД. То, что он испускает, является частью нового индекса. Использование этого индекса очень быстрое, но у него меньше возможностей, чем у представления SQL. Результат карты также может быть источником для агрегирования данных с помощью сокращения. Другие функции позволяют манипулировать результирующим форматом, частично обновлять документ, а также проверять некоторые данные. Они суть CouchDB. Ознакомьтесь с Книгой. - person Marcin Skórzewski; 05.11.2012
comment
Хорошо, поэтому я вернулся к чертежной доске и более подробно прочитал, как работает CouchDB. У меня есть простая система, которая хорошо работает в соответствии с критериями, которые вы указали для сравнения электронной почты. Знаете ли вы, есть ли список других критериев, используемых в электронных письмах? - person Adam Carter; 08.11.2012
comment
Без понятия, я просто написал то, что пришло мне в голову в данный момент. Но я бы не зависел от сравнения электронной почты только с обработкой строк. Типичные системы электронной почты предоставляют псевдонимы, что фактически дает другое произвольное имя для той же учетной записи. - person Marcin Skórzewski; 09.11.2012