CouchDB _changes поведение канала с изменениями документа только в _rev - PullRequest
0 голосов
/ 22 ноября 2018

В основном я запрашиваю представление, запрашивая значение update_seq для возврата.Затем я использую этот возвращенный порядковый номер в последующем запросе _changes.Я ожидаю (что может быть не так?), Что возвращаемые изменения должны быть пустыми;так как я только что запросил представление и запросил изменения с этого представления.

Обычно это работает нормально, за исключением случаев, когда я обновляю документ без изменения его содержимого (т. е. изменяется только поле _rev документа).Теперь я могу запросить представление и изменения, как указано выше, но это всегда даст результат изменения, указывающий на этот измененный документ.Возможно, приведенный ниже код объясняет лучше ...

const request = require("request-promise-native");

const _throw = e => { throw e };

// Given an 'empty' couchdb database 'test' with the following design document:
//
// _id: "_design/test",
// language: "javascript",
//   views: {
//     test: {
//       map: function(doc) {
//         if (doc.message) emit(null, doc.message);
//       }
//     }
//   }

const db = "http://localhost:5984/test";

const get = id =>
  request.get({
    url: `${db}/${id}`,
    json: true,
  })

const post = body =>
  request.post({
    url: `${db}`,
    json: true,
    body
  });

// Insert doc, or update existing doc if it already exists ...
const update = doc =>
  get(doc._id)
    .then(({ _rev }) => post({ ...doc, _rev }))
    .catch(e => e.statusCode === 404 
      ? post(doc) 
      : _throw(e))

// Query the view, make sure to get the update_seq value ...
const messages = () => request
  .get({
    url: `${db}/_design/test/_view/test`,
    qs: { update_seq: true },
    json: true
  })

// Query the _changes feed for any changes since the supplied seq number
const changes = (since = "now") =>
  request
    .get({
      url: `${db}/_changes`,
      qs: { filter: "_view", view: "test/test", since },
      json: true
    })

// Just update the document, query the view, and then pass the returned seq to the changes feed ...
const check = async message => {
  await update({ _id: "test", message });
  const msgs = await messages();
  console.log("messages:", msgs.rows);
  const chgs = await changes(msgs.update_seq);
  console.log("changes:", chgs.results, "\n\n");
}

// I would expect the changes results to always be empty, since I am tracking the 
// changes since the seq number returned from the view (and there are no changes
// to the database inbetween). However, this is only true for when the message field
// of the document changes. Updating the doc without changing this field (i.e. just
// triggering a _rev change) causes the changes result to be always non-empty

const run_checks = async () => {
  await check("1");
  await check("1");
  await check("2");
  await check("2");
  await check("2");
}

run_checks();

Это дает следующие результаты:

$ node changes.js 
messages: [ { id: 'test', key: null, value: '1' } ]
changes: [] 


messages: [ { id: 'test', key: null, value: '1' } ]
changes: [ { seq:
     '55-g1AAAAH3eJzLYWBg4MhgTmEQTM4vTc5ISXIwNDLXMwBCwxygFFMiQ5L8____szKYExlygQLs5mlmqZamZikMnKV5KalpmXmpKXi0JykAySR7kAmJjPjUOYDUxaPalJpkYpZkTKxNCSAT6lFMSEqxSDM1NSXShDwWIMnQAKSAhsxHmJKaZGFoQLSPIaYsgJiyH2FKskmyhbm5CUmmHICYch9kihnER6ZpxuYgt2DqI2jaA4hpwJhgyAIAz9mJKQ',
    id: 'test',
    changes: [ [Object] ] } ] 


messages: [ { id: 'test', key: null, value: '2' } ]
changes: [] 


messages: [ { id: 'test', key: null, value: '2' } ]
changes: [ { seq:
     '57-g1AAAAH3eJzLYWBg4MhgTmEQTM4vTc5ISXIwNDLXMwBCwxygFFMiQ5L8____szKYExlygQLs5mlmqZamZikMnKV5KalpmXmpKXi0JykAySR7kAmJjPjUOYDUxaPalJpkYpZkTKxNCSAT6lFMSEqxSDM1NSXShDwWIMnQAKSAhsxHmJKaZGFoQLSPIaYsgJiyH2FKskmyhbm5CUmmHICYch9kigXER6ZpxuYgt2DqI2jaA4hpwJhgyAIA0HWJKw',
    id: 'test',
    changes: [ [Object] ] } ] 


messages: [ { id: 'test', key: null, value: '2' } ]
changes: [ { seq:
     '58-g1AAAAIzeJyV0EsOgjAQBuBRTNSlJ9ATGKAtbVdyE6WvIEFcsdab6E30JnoTLNYESAyBNJkmbebLP5MDwCL1FKzkuZSpEnEQ0q1vT5Dbr2kCYl1VVZZ6CZzsw5yaSHMSKViWhdLmWGjV0y42tordT5h8hZAxpHDyr6dPimtp382iBY4EGprlUAuXjiAUM4SQgUIxsxWu9rLIrVG0YIE_eCdOuTvl0SgSS0YpHqU8nfKqFe4mIgbROsuo7Trt7bTWfphUiPOwnSn7AHWel-8',
    id: 'test',
    changes: [ [Object] ] } ]

Результат изменений будет пустым только при изменении фактического значения в представлении ...Чего мне не хватает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...