Node.js 如何从CouchDB中的_global_changes中获取已更改文档的详细信息

Node.js 如何从CouchDB中的_global_changes中获取已更改文档的详细信息,node.js,nosql,couchdb,couchdb-2.0,couchdb-nano,Node.js,Nosql,Couchdb,Couchdb 2.0,Couchdb Nano,我正在使用node.js应用程序监听CouchDB实例上所有数据库的更改,以遵循\u global\u更改数据库 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 jus

我正在使用node.js应用程序监听CouchDB实例上所有数据库的更改,以遵循
\u global\u更改
数据库

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' 
    }
}
从这一点上讲,我不知道如何查询
数据库-WHERE-CHANGE-occurrent
,以获取已更改/删除/添加的特定文档,并准确地找出它发生了什么。我在
数据库-WHERE-CHANGE\u中找不到与
更改匹配的文档

任何帮助都将不胜感激

(每当添加某种类型的附件时,我都会尝试倾听,然后对该附件进行处理。)

我的解决方案 正如书中所指出的,我似乎没有任何方法可以做到这一点。相反,每当进行更改时,我从全局更改提要中获得的唯一信息是在特定数据库中进行了更改。然后,我需要查询整个数据库,以确定是否有我感兴趣的信息

在我的用例中,这很容易,因为我正在寻找一种可以作为附件添加的特定类型的文件,然后将其转换为不同的文件类型。但对于其他用例,这可能非常困难或不可能。如果CouchDB能够显示有关全局
\u global\u 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();

因此,是的,这会导致大量额外的查询,对于我的用例来说,这是可行的,但是对于其他用例来说,这可能不太可行。遗憾的是,这个
\u GLOBAL\u CHANGES
提要提供的唯一信息似乎是告诉您哪个数据库被修改了,除非我遗漏了什么?

您不会使用
\u id
来查找文档吗?
\u id
没有文档的
\u id
。它只包含
更新:
+已更改数据库的名称。(对不起,我忘了把第二个填上,它们在上面的对象中都是一样的)。我能从
\u id
中得到的唯一信息是被修改的数据库的名称。啊,我现在明白了。我误解了你的帖子。您正在收听所有数据库更改,而不是特定的更改。遗憾的是,我没有这方面的经验,也不能研究atm。在CouchDB v 2.2.0上调查和测试了一些之后,我不相信有什么方法可以让你做到这一点。唯一的解决办法是使用一个单独的
更改
提要监听每个DB,并相应地处理这些更改,这可能很大程度上取决于您有多少个DB,并且可能会降低应用程序的性能。@BananaAcid请参阅上面的“我的解决方案/伪代码编辑”。您认为提要中没有提供文档ID是正确的。在每次全局更改事件中,我都必须查询相关的整个数据库,以查看是否出现了我正在寻找的内容。