请求提供完整的CouchDB设计文档编写示例及详尽说明
Complete CouchDB Design Document Example
Absolutely! I totally get your frustration with scattered CouchDB docs—having a full, consolidated example makes all the difference. Below is a fully fleshed-out design document that covers all the key components you mentioned, plus explanations for each part so you know how everything fits together:
{ "_id": "_design/comprehensive_example", "_rev": "1-abc123def456ghi789jkl012mnop345qrs678tuv901", // Views: For querying and aggregating data "views": { "by_name": { "map": "function(doc) { if (doc.type === 'user') emit(doc.name, { email: doc.email, age: doc.age }); }", "reduce": "_count" // Built-in reduce function for counting docs }, "by_age_range": { "map": "function(doc) { if (doc.type === 'user' && doc.age) emit(Math.floor(doc.age / 10) * 10, doc.name); }" // No reduce here—we just want to group names by 10-year age brackets } }, // Show functions: Transform a single document into a custom format (HTML, JSON, etc.) "shows": { "user_profile": "function(doc, req) { return { headers: { 'Content-Type': 'text/html' }, body: `<html><body><h1>${doc.name}'s Profile</h1><p>Email: ${doc.email}</p><p>Age: ${doc.age}</p></body></html>` }; }" }, // List functions: Transform view results into custom output "lists": { "user_directory": "function(head, req) { start({ headers: { 'Content-Type': 'text/html' } }); send('<html><body><h1>User Directory</h1><ul>'); var row; while (row = getRow()) { send(`<li>${row.key}: ${row.value.email}</li>`); } send('</ul></body></html>'); }" }, // Update handlers: Modify documents via HTTP POST (instead of PUT) "updates": { "increment_age": "function(doc, req) { if (!doc) { return [null, { error: 'not_found', reason: 'Document does not exist' }]; } doc.age = (doc.age || 0) + 1; return [doc, { ok: true, message: 'Age incremented successfully' }]; }" }, // Filters: Control which docs are replicated or included in changes feeds "filters": { "active_users": "function(doc, req) { return doc.type === 'user' && doc.status === 'active'; }" }, // Validate_doc_update: Enforce rules before a document is saved/updated "validate_doc_update": "function(newDoc, oldDoc, userCtx, secObj) { // Prevent deleting documents if (newDoc._deleted) { throw({ forbidden: 'Document deletion is not allowed' }); } // Require a 'name' field for user docs if (newDoc.type === 'user' && !newDoc.name) { throw({ forbidden: 'User documents must have a name field' }); } // Ensure age is a number if present if (newDoc.age && typeof newDoc.age !== 'number') { throw({ forbidden: 'Age must be a number' }); } }" }
Key Component Breakdowns:
- Views:
map: Emits key-value pairs from documents (we filter forusertype here to avoid processing unrelated docs).reduce: Can use built-in functions like_count,_sum, or custom functions to aggregate view results.
- Shows: Take a single document and return formatted output (here, an HTML profile page). Useful for serving custom content directly from CouchDB.
- Lists: Process entire view result sets to generate output (like an HTML directory of users). Use
getRow()to iterate through view rows. - Updates: Let you modify documents via POST requests—great for atomic operations (like incrementing a counter) without fetching the entire doc first.
- Filters: Used with replication or the
_changesfeed to only include documents that match your criteria (here, only active users). - validate_doc_update: Runs every time a document is created or updated. You can throw errors to block invalid changes (like deleting docs or missing required fields).
How to Use This:
- Save this as a JSON file (e.g.,
design_doc.json). - Upload it to your CouchDB database using a tool like
curl:curl -X PUT http://localhost:5984/your_db/_design/comprehensive_example -d @design_doc.json -H "Content-Type: application/json" - Test each component:
- View:
http://localhost:5984/your_db/_design/comprehensive_example/_view/by_name - Show:
http://localhost:5984/your_db/_design/comprehensive_example/_show/user_profile/user_doc_id - List:
http://localhost:5984/your_db/_design/comprehensive_example/_list/user_directory/by_name - Update:
curl -X POST http://localhost:5984/your_db/_design/comprehensive_example/_update/increment_age/user_doc_id - Filter: Use with
_changes:http://localhost:5984/your_db/_changes?filter=comprehensive_example/active_users
- View:
I totally agree that the official docs could do a better job of putting all this together in one place—this example should cover most common use cases you’ll run into.
内容的提问来源于stack exchange,提问作者chateau
相关产品推荐
相关产品推荐

