как сделать запрос из кода обработчика обновления JavaScript - PullRequest
0 голосов
/ 26 ноября 2018

Что я пытаюсь сделать:

  1. Я хочу добавить данные (id, data) в БД.При этом я хочу проверить, существует ли идентификатор, и если да, добавить к существующим данным.иначе добавьте новую запись (id, data).

Пример: это может быть БД идентификатора студента и оценок в нескольких тестах.Если идентификатор уже существует в БД, я хочу просто добавить к уже существующим результатам тестов в БД, в противном случае создать новую запись: (id, оценки)

Для этого я настроил функцию обработчика обновлений.Я так понимаю, что вставка couchdb по умолчанию не делает выше.Теперь - как мне проверить базу данных на этот идентификатор и, если да, решить, добавлять ли новую запись или добавлять.Я знаю, что есть db.get ().Тем не менее, я предполагаю, что поскольку функция обработчика обновления уже является частью самой базы данных, возможно, существует более эффективный способ сделать это.

Я вижу этот пример кода в вики couchdb:

function(doc, req){
    if (!doc){
        if ('id' in req && req['id']){
            // create new document
            return [req, 'New Document'];
        }
        // change nothing in database
        return [null, 'Incorrect data format'];
    }
    doc[id] = req;
    return [doc, 'Edited World!'];
}

несколько пояснений в этом примере, которые не ясны: откуда мы получаем идентификатор?Часто идентификатор не передается явно при добавлении в БД.

Значит ли это, что нам нужно явно передать поле с именем "_id"?

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

как мне проверить базу данных для этого идентификатора и, если да, решить, добавлять ли новую запись или добавить.

CouchDB сделает это за вас, предполагая, что HTTP-клиент запускает вашобновить функцию, используя идентификатор.Как описано в документации :

Когда запрос к обработчику обновлений включает идентификатор документа в URL, сервер предоставит функции самую последнюю версию этого документа

В примере кода, который вы нашли, функция обновления выглядит как function(doc, req), поэтому в коде внутри этой функции переменная doc будет уже иметь существующий документ "внутри "вашей базы данных CouchDB.Все входящие данные от клиента / пользователя будут найдены где-то в пределах req.

Так что для вашего случая это может выглядеть примерно так:

function(doc, req){
  if (doc) {
    doc.grades.push(req.form.the_grade);
    return [doc, "Added the grade to existing document"];
  } else {
    var newDoc = {_id:req.uuid, grades:[req.form.the_grade]};
    return [newDoc, "Created new document ("+newDoc._id+") for the grade"];
  }
}

Есликлиент выполняет POST для /your_db/_design/your_ddoc/_update/your_update_function/existing_doc_id, после чего будет запущена первая часть if (doc), поскольку вы получите существующий документ (предварительно выбранный для вас) в переменной doc.Если клиент делает POST только на /your_db/_design/your_ddoc/_update/your_update_function, тогда doc не предоставляется, и вы должны создать новый (предложение else).

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


Кроме того: db.get(), который вы упомянули, вероятно, от CouchDB HTTP-клиент библиотека и недоступна (и не будет работать) в контексте любого обновления / шоу / списка / и т. Д.функции, которые выполняются изолированно в базе данных "сама".

0 голосов
/ 26 ноября 2018

Цитируется из документации:

Если вы обновляете существующий документ, у него уже должен быть установлен _id, а если вы создаете новый документ, обязательно установите для его _id что-толибо генерируется на основе входных данных, либо предоставленного req.uuid.Второй элемент - это ответ, который будет отправлен обратно вызывающей стороне.

Итак tl; dr , если _id не указан, используйте req.uuid.

Ссылка на документацию: http://docs.couchdb.org/en/stable/ddocs/ddocs.html#update-functions

...