Обновить поле документа в nano-модуле nodejs для coachdb

Скажите, что через nano на node.js открыта сессия CouchDB.

var dbserv = require('nano')('http://localhost:5984');

На сервере CouchDB dbserv есть доступ к базе данных users с пользователями, у которых есть поле groups, представляющее собой массив.

Если бы я хотел обновить groups для пользователя jim в users, как мне это сделать, не заменяя весь документ?


person Havvy    schedule 24.01.2012    source источник
comment
Вы можете эмулировать это поведение, используя обработчики обновления документа.   -  person Marcello Nuccio    schedule 24.01.2012
comment
@MarcelloNuccio Я видел эту страницу до этого вопроса, и это оставило меня в замешательстве, как ее создать, сохранить и выполнить. А так как я в недоумении, то прошу пример.   -  person Havvy    schedule 24.01.2012


Ответы (2)


CouchDB

Чтобы создать обработчик обновления, напишите проектный документ:

{
  "_id": "_design/yourapp",
  "updates": {
    "foo": "function(doc, req) {
      doc.groups.push(req.query.bar); // or do whatever you like with it
      return [doc, 'done'];
    }"
  }
}

и поместите его в свою базу данных с идентификатором _design/yourapp, затем ПОЛУЧИТЕ его следующим образом:

http://localhost:5984/users/_design/yourapp/_update/foo/jim?bar=baz

нанокушетка

var dbserv = require('nano')('http://localhost:5984');
var db = dbserv.use('users');

var designdoc = {/* The above design document */};

db.insert(designdoc);

db.get('_design/yourapp/_update/foo/jim', {bar: 'baz'});

Обратите внимание, что вам нужно вставить проектный документ только один раз, вы даже можете сделать это вручную, используя curl, а затем, чтобы обновить свои документы, просто сделайте запрос GET, как описано выше.

Отказ от ответственности: не тестировался, и я никогда раньше не использовал nano, но он должен соответствовать тому, что вы должны делать.

person Simon    schedule 25.01.2012
comment
@Havvy, есть одна вещь, о которой вы должны знать: использование обработчика обновлений ЭКВИВАЛЕНТНО для: (1) получения документа; (2) обновить документ; (3) сохранить документ. Это означает, что другое одновременное обновление того же документа может произойти между (1) и (3), и это приведет к конфликту (ответ 409). - person Marcello Nuccio; 26.01.2012

Нашел способ делать обновления без всяких нужд _design и тому подобного. Проблема с Nano CouchDB заключается в том, что вставка на самом деле не предоставляет место для отправки правильного _rev, необходимого для обновления. Во всяком случае, есть обходной путь. Что нужно сделать, так это получить значение _rev из _id, который вы хотите обновить. Итак, вы используете Nano db.get как большую функцию, получаете значение _rev и обновляете свой документ. Вот пример кода:

 users.get('document_name', function(err, doc) {
        updaterev = doc._rev;
        users.insert({title:'here_ya_go',_rev:updaterev},'document_name', function(err, body , header) {
            if (!err)
            {
                console.log(body);
                res.send('update website succeed');
            }
            else
            {
                console.log(err.error);
            }
        });
  });

Когда функции db.insert находятся внутри функции db.get, это дает нам возможность получить _rev и обновить документ.

Я знаю, возможно, это не я изобрел, но важно иметь этот фрагмент кода, который можно взять и использовать. Удачи.

person Dagan Bog-Computers    schedule 13.11.2013