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 文档。
干杯。
我们在 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 文档。 干杯。