В основном я запрашиваю представление, запрашивая значение 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] ] } ]
Результат изменений будет пустым только при изменении фактического значения в представлении ...Чего мне не хватает?