// Map function
function(doc){
if(doc.type == "photo"){
emit(null, parseInt(doc._id.replace(/\D/g,'')));
}
}
CouchDB: Auto increment IDs with PHP
Sep 24, 2010
1 minute read.
couchdb
php
Create a seed, which will be a CouchDB view.
Map function extracts numeric part of every doc of type "photo".
reduce function finds the max value from those numeric values emitted from map function.
// Reduce function
function(key, values){
var max = 0;
for(i in values){
if(max < values[i]){
max = values[i];
}
}
return max;
}
This view is saved as _design/helpers/photoid
Now write a function in PHP to increment the ID as required and to add the document.
<?php
function addDoc($url, $data, $seed, $idprefix, $incrementBy=1){
// Get the current ID value
$ch = curl_init("$url/_design/$seed");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = json_decode(curl_exec($ch), true);
// Increment and add prefix as per given parameters
$id = $idprefix . ($result['rows'][0]['value'] + $incrementBy);
// Add document to couchdb
$ch = curl_init("$url/$id");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, array ("Content-Type: application/json"));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// Print result
echo curl_exec($ch);
}
Example usage of above PHP function
addDoc("http://localhost:5984/photoblog",
Array("type"=>"photo", "published"=>0, "place"=>"Karnataka, India"),
"helpers/_view/photoid",
"p");
As of now, PHP function involves two http calls for adding single document. Let me know if you find any ways to reduce it to one http call.
About Aravinda VK
Partner at Kadalu Investments, Creator of Sanka, Creator of Chitra, GlusterFS core team member, Maintainer of Kadalu Storage