我正在使用我的 node.js 应用程序中的nano_global_changes
来监听 CouchDB 实例上所有数据库的更改以跟踪数据库。
const globalChanges = nano.use('_global_changes');
const feed = globalChanges.follow({ since: "now", include_docs: true });
feed.on('change', function (change) {
// Here's the change that just happened
console.log(change);
});
feed.follow();
这在返回对发生的每个更改的引用方面非常有用,但是我不知道如何访问实际文档以及从这一点开始更改的详细信息。
来自提要的每个更改都如下所示:
{
seq: '84-g1AAAAJjeJyd0UsKwjAQBuDY-tq6EJd6AklS-3Blb6KZTIdSqq5c6030JnoTvUlN0m6EIrQEJjDh_2AyJWNsmvvIZvp80TlCKmS85uaI0jx5isGyqqoi99XiaBoTzYmQoC3wh4GVqbBrpLmTBIQoxaarlFpp30gjJyUipAi2XaWDla4_02WSVIyyo3Qamspu5jLY3WpjpwHXQkW8l_aotafVBk6jhHgg-2mvWntbzXMaZjFxxF7ap9bcv_n1BhJFKlBtueILoc2geA',
id: 'updated:DATABASE-WHERE-CHANGE-HAPPENED',
changes: [ { rev: '22-8a4f097580a344b3d70e5adc17971cb4' } ],
doc: {
_id: 'updated:DATABASE-WHERE-CHANGE-HAPPENED',
_rev: '22-8a4f097580a344b3d70e5adc17971cb4'
}
}
从这一点来看,我无法弄清楚如何查询DATABASE-WHERE-CHANGE-HAPPENED
以获取已更改/删除/添加的特定文档,并确切了解它发生了什么。我找不到DATABASE-WHERE-CHANGE_HAPPENED
匹配的文档change._rev
或change.seq
...
任何帮助将不胜感激。
(每当添加某种类型的附件时,我都会尝试监听,然后对该附件执行某些操作。)
我的解决方案
正如Hypnic Jerk在下面的评论中指出的那样,我似乎没有办法做到这一点。相反,每当进行更改时,我从全局更改提要中获得的唯一信息是在特定数据库中进行了更改。那么,我需要查询整个数据库以查找是否有我感兴趣的信息。
在我的用例中,这很容易,因为我正在寻找可以作为附件添加的某种类型的文件,然后将其转换为不同的文件类型。但对于其他用例,这可能非常困难或不可能。如果 CouchDB 可以显示有关全局_global_changes
提要中所做更改的更多信息,那将非常有帮助。
const globalChanges = nano.use('_global_changes');
const feed = globalChanges.follow({ since: "now", include_docs: true });
feed.on('change', function (change) {
// STEP 1 - See if the database mentioned in change.doc._id
// is one that I am interested in
// STEP 2 - If so, extract the database name from change.doc._id
// STEP 3 - Query the database with this name for any docs
// with attachments
// const db = nano.use(databaseName);
// const docsWithAttachments = await db.find({
// selector: { _attachments: { "$exists": true }}
// } ,{ include_docs: true });
// STEP 4 - Go through all the attachments for each document to see if
// there are any files of the type that I am interested in.
// STEP 5 - Do something with those files.
});
feed.follow();
所以是的,这会导致很多额外的查询,并且它适用于我的用例,但对于其他用例,这可能不可行。可悲的是,提要似乎提供的唯一信息_GLOBAL_CHANGES
是告诉您修改了哪个数据库,除非我遗漏了什么?