首页 > 解决方案 > 如何从 CouchDB 中的 _global_changes 获取更改文档的详细信息

问题描述

我正在使用我的 node.js 应用程序中的nano_global_changes来监听 Co​​uchDB 实例上所有数据库的更改以跟踪数据库。

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._revchange.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是告诉您修改了哪个数据库,除非我遗漏了什么?

标签: node.jsnosqlcouchdbcouchdb-2.0couchdb-nano

解决方案


推荐阅读