CouchDB 计算所有文件和 return 个数字?

CouchDB count all documents and return a number?

我们在 CouchDB 中有一个大学项目,我正在使用节点,我想创建一个视图,returns 通过电子邮件发送我所有的文档。

我找不到任何有用的东西,我不确定我错过了什么,我尝试了很多不同的 reduce 函数和 emit 方法。

感谢您的回答。

文档有 2 个字段,姓名和电子邮件

您可以使用GET /{db},其中returns有关指定数据库的信息。这是一个包含 属性 doc_count.

JSON 对象

doc_count (number) – A count of the documents in the specified database.

以Angular为例,可以通过以下方法完成:

async countDocuments(database: string): Promise<number> {
  return this.http.get<any>(this.url('GET', database), this.httpOptions).toPromise()
    .then(info => info['doc_count']);
}

不要使用 db endpoint,因为响应字段 doc_count 包括设计文档以及可能没有 email 字段的其他文档。

一种直接的方法是使用视图。该代码片段演示了数据库信息 doc_count 和使用 PouchDB 的视图 total_rows 之间的区别。我想索引可能有更有趣的用途。

设计文档很简单

{
 _id: '_design/my_index',
   views: {
     email: {
       map: function(doc) {
         if (doc.email) emit(doc.email);
       }.toString()
    }
  }
}

并且视图查询非常高效简单。

db.query('my_index/email', {
        include_docs: false,      
        limit: 0
      })

const gel = id => document.getElementById(id);
let db;

function setJsonToText(elId, json) { 
  gel(elId).innerText = JSON.stringify(json, undefined, 3);
}
async function view() {
  // display db info
  setJsonToText('info', await db.info());
  // display total number or rows in the email index
  const result = await db.query('my_index/email', {
    include_docs: false,  
    limit: 0
  });
  setJsonToText('view', result);

}

// canned test documents
function getDocsToInstall() {
  return [{
      email: 'jerry@garcia.com',
    },
    {
      email: 'bob@weir.com',
    },
    {
      email: 'phil@lesh.com'
    },
    {
      email: 'wavy@gravy.com'
    },
    {
      email: 'samson@delilah.com'
    },
    {
      email: 'cosmic@charlie.com'
    },
    // design doc
    {
      _id: '_design/my_index',
      views: {
        email: {
          map: function(doc) {
            if (doc.email) emit(doc.email);
          }.toString()
        }
      }
    }
  ]
}

// init example db instance
async function initDb() {
  db = new PouchDB('test', {
    adapter: 'memory'
  });

  await db.bulkDocs(getDocsToInstall());

};

(async() => {
  await initDb();
  await view();
})();
<script src="https://github.com/pouchdb/pouchdb/releases/download/7.1.1/pouchdb-7.1.1.min.js"></script>
<script src="https://github.com/pouchdb/pouchdb/releases/download/7.1.1/pouchdb.memory.min.js"></script>
<pre>Info</pre>
<pre id='info'></pre>
<div style='margin-top:2em'></div>
<pre>email view</pre>
<pre id='view'>
</pre>

假设:

假设客户数据库中存在以下文档:

[
{
  "_id": "93512c6c8585ab360dc7f535ff00bdfa",
  "_rev": "1-299289ee89275a8618cd9470733035f4",
  "name": "Tom",
  "email": "tom@domain.com"
 },
{
  "_id": "93512c6c8585ab360dc7f535ff00c930",
  "_rev": "1-a676883d6f1b5bce3b0a9ece92da6964",
  "name": "Tom Doe",
  "email": "tom@domain.com"
 },
{
  "_id": "93512c6c8585ab360dc7f535ff00edc0",
  "_rev": "1-09b5bf64cfe66af7e1134448e1a328c3",
  "name": "John",
  "email": "john@domain.com"
 },
{
  "_id": "93512c6c8585ab360dc7f535ff010988",
  "_rev": "1-88e347af11cfd1e40e63920fa5806fd2",
  "name": "Alan",
  "email": "alan@domain.com"
 }


]

如果我对你的查询理解正确,那么根据上面的数据,你需要下面给定的结果集。

{
"tom@domain.com": 2,
"alan@domain.com": 1,
"john@domain.com": 1
}

解法:

为了实现上述目标,请考虑以下包含具有 Map 和 Reduce 功能的视图的设计文档。

{
  "_id": "_design/Customers",
  "views": {
    "by-email": {
      
      "map": "function (doc) {
         if(doc.email){
              emit(doc.email, doc._id);
         }
       }",
      "reduce": "_count"
    }
  },
  "language": "javascript"
}

如果文档中存在键 email,上述视图函数会发出文档键的值。

reduce 函数 _count 是一个内置的 reducer(由 CouchDB 提供),它执行计数逻辑。

正在执行视图查询:

为了查询此 view,您需要:select 视图函数,标记要执行的 reduce(因为它对 运行 reduce 是可选的)并设置 1作为组级别。

这是通过 UI:

实现的方法

结果:

以上查询给出的结果如下: [![map reduce 查询的结果

希望这对您有所帮助。 有关其他 reduce 函数和组级别的更多详细信息,请参阅 CouchDB 文档。 干杯。