[PHP Mongodb] Implement MapReduce

In previous posti https://sabitlabscode.wordpress.com/2013/07/29/mongodb-understanding-mapreduce/ , saya sudah paparkan tentang mapreduce dan bagaimana cara membuatnya di mongodb. So, how to implement it in PHP? Sebenarnya tidak terlalu jauh berbeda dengan memanggil tabel biasa. Jika anda memiliki tabel “member” misal, anda bisa memanggil semua datanya pada PHP dengan :

             
$result = $database->selectCollection('member')->find();

untuk mapreduce anda dapat memanggil nya sama dengan cara di atas, seperti berikut :

             
$result = $database->selectCollection('your_mapreduce_name')->find();

Dan berikut adalah contoh lengkap mulai dari mendefinisikan mapreduce hingga memanggilnya pada PHP. Pertama kita harus mendefinisikan map dan reduce nya seperti berikut (i use same case with previous post) :

     public function getSiswabyjk()
    {
        try {
            $connection = new Mongo();
            //get your database
            $database = $connection->selectDB('your_database_name');
            //define map function
            $map1=new MongoCode("function(){emit(this.sex,1);}");
            //define reduce function
            $reduce1=new MongoCode("function(key,value){".
                "var count=0;".
                "for(var i=0;i<value.length;i++){".
                "count+=value[i]".
                "}".
                "return count;".
                "}");
            //define map reduce function
            $command = array(
                'mapreduce' => 'your_table_name_here', // set table name
                'map' => $map1, // set map
                'reduce' => $reduce1, // set reduce
                'out' => 'mapreduce_name'  //set name of mapreduce, it use for call mapreduce
            );
            //run mapreduce command
            $database->command($command);
            // get result from mapreduce
            $result = iterator_to_array($database->selectCollection('mapreduce_name')->find());
            return $result;
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die($e->getMessage());
        }                
    }

Finish, you can see the result from this function..
Happy coding..

[Mongodb] Understanding MapReduce

Mongodb memiliki sesuatu yang disebut mapreduce yang biasa digunakan untuk menganalisis data mongodb lebih jauh. Mapreduce sendiri adalah sebuah proses yang membagi-bagi suatu proses besar menjadi subtask2 yang lebih kecil. Pada map reduce sendiri terdapat dua buah proses yaitu map dan reduce.

– Map adalah proses dimana data yang besar akan dibagi-bagi menjadi beberapa bagian yang lebih kecil. For example kita ingin menganalisis orang  yang ada di seluruh Indonesia, kemudian kita bagi-bagi data nya berdasarkan provinsinya. Setelah itu data pada masing-masing provinsi akan di olah masing-masing secara independent dengan provinsi lain.

– Reduce adalah proses dimana hasil olahan pada proses Map tadi kita gabungkan untuk kita olah secara keseluruhan.

This is some example how we implement mapreduce in mongodb :

Misal saya memiliki table “member” with field : _id, name, sex(male,female). Kita ingin tahu total “member” male dan female. Untuk kasus ini kita gunakan map reduce. Pertama definisikan fungsi map :

             
//this code check data by field sex. It will return value like this male = [1][1] female =[1][1][1][1]
//always add [1] for its sex
var map1=function(){emit(this.sex,1);}

Setelah itu definisikan reduce nya :

 var reduce1 = function(key, values) {
   var count = 0;
   for (var i = 0; i < values.length; i++){
      count += values[i];
   }
   return count;
 };

Setelah itu kita gabungkan kedua fungsi di atas menjadi mapreduce seperti berikut :

 db.runCommand({
    mapreduce: 'your_table_name',
    map: map1,
    reduce: reduce1,
    out: 'name_that_you_call_for_this_mapreduce'
 })

Jika mapreduce anda sudah berhasil dibuat, maka dia akan menampilkan pesan yang memperlihatkan result nya. Tetapi jika tidak, maka dia akan menampilkan pesan error.

Kita telah selesai membuat mapreduce, sekarang bagaimana kita memanggilnya untuk melihat hasilnya? Cukup masukkan perintah berikut :

 db.name_that_you_call_for_this_mapreduce.find()

Finished, you can see the result.. Hope it help, Happy coding..

[PHP Yii Mongodb] Work With Data Relation (2)

Melanjutkan previous post di https://sabitlabscode.wordpress.com/2013/07/14/php-yii-mongodb-work-with-data-relation/, postingan ini akan membahas penggunaan cara ke 2 yaitu dengan cara memasukkan langsung data ke dalam document. Anggaplah saya memiliki document “news” yang data nya terdiri dari :

news : title, news, comments [comment_title, comment_name, comment]

dapat anda lihat bahwa setiap satu “news” dapat memiliki banyak komentar di dalamnya. Bagaimana cara membuatnya? Okeh, pertama-tama kita buat terlebih dahulu modelnya, kita definisikan semua fungsi-fungsi yang kita butuhkan mulai dari savedate, edit, delete, findall, findone, da addcomment. Sehingga model anda akan menjadi seperti berikut :

 <?php
//definition model name
class NewsForm extends CFormModel
{
    //define variable in model 
    public $title;
    public $news;
    public $comment_name;
    public $comment_title;
    public $comment;

    // rule validation
    public function rules()
    {
        return array(
            array('title,news', 'required'),
            //required just when we add comment
            array('comment_name,comment_title,comment','required','on'=>'createcomment'),
        );
    }

    //attribute label in form
    public function attributeLabels()
    {
        return array(
            'title'=>'Title',
            'news'=>'Insert Your News Here',
            'comment_name'=>'Created By',
            'comment_title'=>'Comment Title',
            'comment'=>'Comment',
        );
    }

    //run it for save data
    public function savenews()
    {
        try {
            //get connection to access document
            $connection = new Mongo();
            $collection = $connection->belajar->news;
            $varnews = array(
                'title' => $this->title,
                'news' => $this->news,
            );
            //insert data
            $collection->insert($varnews,array('safe'=>true));
            return true;
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die('Failed to insert data '.$e->getMessage());
        }
    }

    //run it for update data
    public function editnews($id)
    {
        try {
            $connection = new Mongo();
            $collection = $connection->belajar->news;
            $varnews = array('$set'=>array(
                    'title' => $this->title,
                    'news' => $this->news,
                )
            );        
            //update data    
            $collection->update(array('_id' => new MongoId($id)),$varnews);
            return true;
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die('Failed to insert data '.$e->getMessage());
        }
    }

    //run it for delete data
    public function deletenews($id)
    {    
        try {
            $connection = new Mongo();
            $collection = $connection->belajar->news;
            //remove data
            $collection->remove(array('_id'=>new MongoId($id)));
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die('Failed to do operation '.$e->getMessage());
        }
    }

    // this will return all data from document nilai
    public function findallmongo()
    {
        try {
            $connection = new Mongo();
            $collection = $connection->belajar->news;
            //get all data
            $result= $collection->find();

            return $result;
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die($e->getMessage());
        }    
    }

    // find news by id
    public function findOneById($id)
    {
        try 
        {
            $connection = new Mongo();
            $collection = $connection->belajar->news;
            //get data by $id in parameter
            return $collection->findOne(array('_id'=>new MongoId($id)));
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die($e->getMessage());
        }    
    }

    //use for add a comment in news
    public function addcomment($id)
    {
        try 
        {
            $connection = new Mongo();
            $collection = $connection->belajar->news;
            //set some value for comment
            $varcomment = array(
                'comment_name' => $this->comment_name,
                'comment_title' => $this->comment_title,
                'comment'=>$this->comment
            );

            // we use $push to add insert value to comments
            // if we not use $push, it replace old data that
            // we have insert
            $collection->update(array('_id' => new MongoId($id)),
                array('$push' =>array('comments' => $varcomment)),
                array('upsert'=>true));
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die($e->getMessage());
        }
    }
}

Setelah membuat model, kita lanjutkan dengan membuat controller agar user dapat melakukan request pada action-action yang telah kita tentukan. Pada controller ini kita akan menyediakan action-action berikut :

– action index = view all data from news

– actionview = show single data by id, pada actionview juga akan disediakan fitur untuk menambah komentar

– actioncreate = insert new data to document

– actionupdate = update data

– actiondelete = delete data from document

dan berikut adalah code dari controller nya :

 <?php
class NewsController extends Controller
{
    // action index to see all data in document nilai
    public function actionIndex()
    {
        $model=new NewsForm;
        //get all data from model
        $data=$model->findallmongo();

        $this->render('index',array(
            'data'=>$data,
            'model'=>$model,
        ));
    }

    // it will show detail data from tabel "nilia"
    public function actionView($id)
    {
        $model=new NewsForm('createcomment');//it will do validation for "createdcomment"
        // call a data from model "news" by id
        $data=$model->findOneById($id);
        //set field model with $data that 
        //we get from model
        $model->news=$data['news'];
        $model->title=$data['title'];

        //if user do submit(POST) data
        //for write a comment, then do this
        if(isset($_POST['NewsForm']))
        {
            //set value with data that have been submitted
            $model->comment_name=$_POST['NewsForm']['comment_name'];
            $model->comment_title=$_POST['NewsForm']['comment_title'];
            $model->comment=$_POST['NewsForm']['comment'];

            //check validate
            if($model->validate())
            {
                // call function addcomment
                if($model->addcomment($id))
                {
                    $this->redirect(array('view'));
                }
            }
        }

        $this->render('view',array(
            'data'=>$data,
            'model'=>$model,
        ));

    }

    // it use for create new data
    public function actionCreate()
    {
        $model=new NewsForm;
        //when user do submit to this
        if(isset($_POST['NewsForm']))
        {
            $model->news=$_POST['NewsForm']['news'];
            $model->title=$_POST['NewsForm']['title'];
            if($model->validate())
            {
                //save data
                if($model->savenews())
                {
                    $this->redirect(array('index'));
                }
            }
        }
        $this->render('update',array('model'=>$model));
    }

    // update data
    public function actionUpdate($id)
    {
        //define model
        $model=new NewsForm;
        // get data by id
        $data=$model->findOneById($id);
        //set value
        $model->news=$data['news'];
        $model->title=$data['title'];

        //do this when submit
        if(isset($_POST['NewsForm']))
        {
            //set value with submit value
            $model->news=$_POST['NewsForm']['news'];
            $model->title=$_POST['NewsForm']['title'];

            if($model->validate())
            {
                //edit data
                if($model->editnews($id))
                {
                    $this->redirect(array('index'));
                }
            }
        }
        $this->render('update',array('model'=>$model));    
    }

    // delete data
    public function actionDelete($id)
    {
        $model= new NewsForm;
        $model->deletenews($id);
        $this->redirect(array('index'));
    }
}

Di atas adalah code controller kita. Anda dapat melihat pada komentar-komentar code nya untuk melihat penjelasannya.
Setelah membuat controller nya, sekarang saatnya membuat tampilan dari controller itu sendiri. Berikut tampilan yang akan kita buat mulai dari index.php

 <h1>This Is All News That We Have In Mongodb</h1>
<?php echo CHtml::link('Create News',array('create')); ?>
<?php 
    while ($data->hasNext()):
        $news= $data->getNext(); 
?>

<h2>
<?php echo CHtml::link($news['title'],array('view','id'=>$news['_id'])); ?>
</h2>
[[
<?php 
$totalcomment=0;
if(isset($news['comments']))
    $totalcomment=count($news['comments']);
echo 'Total Comment('.$totalcomment.') | ';
?>
<?php echo CHtml::link('Update',array('update','id'=>$news['_id'])) ?> |
<?php echo CHtml::link('Delete',array('delete','id'=>$news['_id'])) ?>
]]<br/>
<?php endwhile; ?>

Kemudian tampilan untuk actionCreate dan actionUpdate yaitu create.php

 <h1>Test Mongo - Pelajaran</h1>
<div>
<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'contact-form',
    'enableClientValidation'=>true,
    'clientOptions'=>array(
        'validateOnSubmit'=>true,
    ),
)); ?>

    <p>Fields with <span>*</span> are required.</p>

    <?php echo $form->errorSummary($model); ?>

    <div>
        <?php echo $form->labelEx($model,'title'); ?>
        <?php echo $form->textField($model,'title'); ?>
        <?php echo $form->error($model,'title'); ?>
    </div>

    <div>
        <?php echo $form->labelEx($model,'news'); ?>
        <?php echo $form->textArea($model,'news'); ?>
        <?php echo $form->error($model,'news'); ?>
    </div>

    <div>
        <?php echo CHtml::submitButton('Submit'); ?>
    </div>
<?php $this->endWidget(); ?>
</div>

dan yang terakhir adalah actionView yang akan menampilkan single data dan dapat menambahkan komentar di dalamnya :

 <h1>View News</h1>

<h2><?php echo $data['title']; ?></h2>
<p><?php echo $data['news'];?></p>
<table>
    <tr>
        <td>Craeted By</td>
        <td>Comment Title</td>
        <td>Comment</td>
<?php
if(isset($data['comments']))
{
    foreach ($data['comments'] as $key => $value) {
        echo '<tr>';
        echo '<td>'.$value['comment_name'].'</td>';
        echo '<td>'.$value['comment_title'].'</td>';
        echo '<td>'.$value['comment'].'</td>';
    }
}
?>
</table>

<h2>Insert Your Comment Here :</h2>
<div>
<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'contact-form',
    'enableClientValidation'=>true,
    'clientOptions'=>array(
        'validateOnSubmit'=>true,
    ),
)); ?>

    <p>Fields with <span>*</span> are required.</p>

    <?php echo $form->errorSummary($model); ?>

    <div>
        <?php echo $form->labelEx($model,'comment_name'); ?>
        <?php echo $form->textField($model,'comment_name'); ?>
        <?php echo $form->error($model,'comment_name'); ?>
    </div>

    <div>
        <?php echo $form->labelEx($model,'comment_title'); ?>
        <?php echo $form->textField($model,'comment_title'); ?>
        <?php echo $form->error($model,'comment_title'); ?>
    </div>

    <div>
        <?php echo $form->labelEx($model,'comment'); ?>
        <?php echo $form->textArea($model,'comment'); ?>
        <?php echo $form->error($model,'comment'); ?>
    </div>

    <div>
        <?php echo CHtml::submitButton('Submit'); ?>
    </div>
<?php $this->endWidget(); ?>
</div>

Okeh, itulah dia sedikit contoh membuat proses CRUD untuk document mongodb yang memiliki embedded document di dalamnya. Yang perlu diperhatikan adalah kapan kita harus menggunakan relasi langsung dan kapan kita menggunakan embed document karena tentu ini akan berpengaruh pada aplikasi yang anda buat..

Finish… Hope it help.. Happy coding… 😀

[PHP Yii Mongodb] Work With Data Relation

Pada rdbms biasanya kita sudah tidak asing dengan istilah tabel relation yang membuat hubungan antara dua tabel atau lebih. Bagaimana dengan mongodb? bukankah mongodb adalah nosql bukan “relational DBMS”? Ya, mongodb juga telah mengakomodasi hal tersebut walaupun tidak persis sama dengan yang dimiliki pada rdbms. Ada 2 cara untuk mengimplementasikannya di dalam mongodb.

1. Membuat field relasi langsung.

Ini sama dengan yang biasa kita lakukan pada rdbms, dimana kita membuat field pengubung (foreign key) pada suatu tabel untuk membuat hubungan antar tabel.

2. Memasukkan data ke dalam document langsung.

Sebenarnya ini bukanlah membuat relation ke dalam tabel, tapi kita memasukkan langsung data-data ke dalam sebuah document. Sebagai contoh dalam mysql kita memiliki tabel “berita” dan “komentar” dimana berita dapat memiliki banyak komentar. Hubungan antara keduanya berita dapat memiliki lebih dari satu komentar, dan komentar hanya memiliki satu buah berita. Pada rdbms kita membuatnya dengan dua buah tabel seperti berikut :

– tabel 1 = > berita : id, judul, isi berita

– tabel 2 => komentar : id, judul komentar, isi komentar, berita_id (foreign key)

pada mongodb, kita dapat memasukkannya langsung ke dalam document berita menjadi seperti berikut :

– document berita : id, judul, isi berita, komentar [id, judul, isi komentar]

Tetapi perlu dipahami kasus-kasus dimana kita lebih baik menggunakan cara 1 atau cara 2.

Ok, sekarang kita coba langsung implementasinya. Pada postingan kali ini akan dibahas penggunaan cara 1, maybe next time akan membahas cara 2.  Kita memiliki 3 buah document :

– siswa : id, nama

– pelajaran : id, nama pelajaran

– nilai : id, siswa_id, pelajaran_id, nilai

Anggaplah kita sudah membuat operasi CRUD untuk document “siswa” dan “pelajaran” (if you dont know how to do it, search it here https://sabitlabscode.wordpress.com/tag/mongodb/). Okeh, sekarang buatlah sebuah model nilai seperti berikut :

 <?php

class NilaiForm extends CFormModel
{
    //define variable in 
    public $pelajaran_id;
    public $siswa_id;
    public $nilai;

    // rule validation
    public function rules()
    {
        return array(
            array('pelajaran_id, siswa_id, nilai', 'required'),
        );
    }

    //attribute label in form
    public function attributeLabels()
    {
        return array(
            'pelajaran_id'=>'Pelajaran',
            'siswa_id'=>'Siswa',
            'nilai'=>'Nilai'
        );
    }

    //run it for save data
    public function savemongo()
    {
        try {
            $connection = new Mongo();
            $database = $connection->selectDB('belajar');
            $collection = $database->selectCollection('nilai');
            $varsiswa = array(
                'pelajaran_id' => new MongoId($this->pelajaran_id),
                'siswa_id' => new MongoId($this->siswa_id),
                'nilai'=>$this->nilai
            );
            $collection->insert($varsiswa,array('safe'=>true));
            return true;
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die('Failed to insert data '.$e->getMessage());
        }
    }

    //run it for update data
    public function editmongo($id)
    {
        try {
            $connection = new Mongo();
            $database = $connection->selectDB('belajar');
            $collection = $database->selectCollection('nilai');
            $varsiswa = array(
                'pelajaran_id' => $this->pelajaran_id,
                'siswa_id' => $this->siswa_id,
                'nilai'=>$this->nilai
            );
            $collection->update(array('_id' => new MongoId($id)),$varsiswa);
            //$collection->insert($varsiswa,array('safe'=>true));
            return true;
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die('Failed to insert data '.$e->getMessage());
        }
    }

    //run it for delete data
    public function deletemongo($id)
    {    
        try {
            $connection = new Mongo();
            $collection = $connection->belajar->nilai;
            $collection->remove(array('_id'=>new MongoId($id)));
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die('Failed to do operation '.$e->getMessage());
        }
    }

    // this will return all data from document nilai
    public function findallmongo()
    {
        try {
            $connection = new Mongo();
            $database = $connection->selectDB('belajar');
            $collection = $database->selectCollection('nilai');
            $result= $collection->find();

            return $result;
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die($e->getMessage());
        }    
    }

    public function findOneById($id)
    {
        try 
        {
            $connection = new Mongo();
            $database = $connection->selectDB('belajar');
            $collection = $database->selectCollection('nilai');
            return $collection->findOne(array('_id'=>new MongoId($id)));
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die($e->getMessage());
        }    
    }
}

Setelah itu, buatlah controller untuk request pada aplikasi :

 <?php

class NilaiController extends Controller
{
    // action index to see all data in document nilai
    public function actionIndex()
    {
        $model=new NilaiForm;
        $data=$model->findallmongo();

        // mongodb cant do join, so we need to call model "pelajaran" and "siswa"
        // to show all field that owned by "pelajaran" and "siswa" 
        $m1=new PelajaranForm; 
        $m2=new SiswaForm;
        $this->render('index',array(
            'data'=>$data,
            'm1'=>$m1,
            'm2'=>$m2,
        ));
    }

    // it will show detail data from tabel "nilia"
    public function actionView($id)
    {
        $model=new NilaiForm;
        // call a data from model "nilai"
        $data=$model->findOneById($id);
        $m1=new PelajaranForm;
        $m2=new SiswaForm;

        $this->render('view',array(
            'data'=>$data,
            'm1'=>$m1,
            'm2'=>$m2,
        ));

    }

    // it use for create new data
    public function actionCreate()
    {
        $model=new NilaiForm;
        if(isset($_POST['NilaiForm']))
        {
            $model->pelajaran_id=$_POST['NilaiForm']['pelajaran_id'];
            $model->siswa_id=$_POST['NilaiForm']['siswa_id'];
            $model->nilai=$_POST['NilaiForm']['nilai'];
            if($model->validate())
            {
                if($model->savemongo())
                {
                    $this->redirect(array('index'));
                }
            }
        }
        $this->render('Nilai',array('model'=>$model));
    }

    // update data
    public function actionUpdate($id)
    {
        $model=new NilaiForm;
        $data=$model->findOneById($id);
        $model->name=$data['name'];

        $model->pelajaran_id=$data['pelajaran_id'];
        $model->siswa_id=$data['siswa_id'];
        $model->nilai=$_POST['NilaiForm']['nilai'];

        if(isset($_POST['NilaiForm']))
        {
            $model->pelajaran_id=$_POST['NilaiForm']['pelajaran_id'];
            $model->siswa_id=$_POST['NilaiForm']['siswa_id'];

            if($model->validate())
            {
                if($model->editmongo($id))
                {
                    $this->redirect(array('index'));
                }
            }
        }
        $this->render('Nilai',array('model'=>$model));    
    }

    // delete data
    public function actionDelete($id)
    {
        $model= new NilaiForm;
        $model->deletemongo($id);
        $this->redirect(array('index'));
    }
}

Kemudian aturlah tampilan datanya. Ini adalah tampilan untuk actionIndex,

 <h1>Test Mongo - Nilai</h1>
<?php 
    while ($data->hasNext()):
        $siswa = $data->getNext(); 

$pelajaran=$m1->findOneById($siswa['pelajaran_id']);
$sisw=$m2->findOneById($siswa['siswa_id']);
?>

<b>
<?php echo CHtml::link($pelajaran['name'],array('view','id'=>$siswa['_id'])); ?> | 
<?php echo CHtml::link($sisw['name'],array('view','id'=>$siswa['_id'])); ?>
</b>
[[
<?php echo CHtml::link('Update',array('update','id'=>$siswa['_id'])) ?> |
<?php echo CHtml::link('Delete',array('delete','id'=>$siswa['_id'])) ?>
]]<br/>
<?php endwhile; ?>

Ini tampilan untuk actioncreate dan actionupdate

 <h1>Test Mongo - Pelajaran</h1>
<div>
<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'contact-form',
    'enableClientValidation'=>true,
    'clientOptions'=>array(
        'validateOnSubmit'=>true,
    ),
)); ?>

    <p>Fields with <span>*</span> are required.</p>

    <?php echo $form->errorSummary($model); ?>

    <div>
        <?php echo $form->labelEx($model,'pelajaran_id'); ?>
        <?php echo $form->dropDownList($model,'pelajaran_id',PelajaranForm::dropdown(),array('empty'=>'- Select Pelajaran-')); ?>
        <?php echo $form->error($model,'pelajaran_id'); ?>
    </div>

    <div>
        <?php echo $form->labelEx($model,'siswa_id'); ?>
        <?php echo $form->dropDownList($model,'siswa_id',SiswaForm::dropdown(),array('empty'=>'- Select Pelajaran-')); ?>
        <?php echo $form->error($model,'siswa_id'); ?>
    </div>

    <div>
        <?php echo CHtml::submitButton('Submit'); ?>
    </div>
<?php $this->endWidget(); ?>
</div>

dan ini adalah tampilan untuk actionView

 <h1>Test Mongo - Nilai</h1>
<?php
$pelajaran=$m1->findOneById($data['pelajaran_id']);
$sisw=$m2->findOneById($data['siswa_id']);
echo $pelajaran['name'];
echo $sisw['name'];
?>

Anda dapat pelajari penjelasan code-code tersebut dari komentar yang ada pada code dan postingan sebelumnya tentang mongodb..

Selesai.. Hope it help..

Happy coding.. 😀

[PHP Mongodb] View And Modified Subset Field

Pada suatu collection, tidak jarang kita hanya ingin menampilkan atau memodifikasi sebagian data pada collection tersebut. Dan berikut cara yang dapat kita lakukan.

1. View Subset Field

//first array use to filter, second array for select where field we want to show.
//if second array is empty, then it will show all field in the colletion
$collection->find(array(),array('field1','field2'));

2. Update Subset Field

//use '$set' to do it
$collection->update(array('_id' => MongoId('your id field')),
array('$set' => array('field1' => 'Value From Field 1')));

Pada code di atas kita tidak ingin melakukan update pada semua field, tetapi hanya pada “field1” saja. Untuk itu kita gunakan ‘$set’ yang menandakan hanya akan mengeset field itu saja.

3. Delete Subset Field

//use '$unset' to do it and
$collection->update(array('_id' => MongoId('your id field')),
array('$unset' => array('field1' => True)));

Kita menggunakan ‘$unset’ untuk meng-unset nilai pada field yang terdapat pada array.

4. Rename Field Name

 $collection->update(array(),array('$rename' => array('jk' =>'jkelamin')));

Mungkin jika anda sudah terlanjut memberi nama field untuk jenis kelamin dengan “jk” lalu ingin menggantinya menjadi field “jkelamin” maka anda dapat menggunakan ‘$rename’

 

Itulah beberapa contoh memodifikasi subset field pada mongodb..

Finish… Happy Coding..

[PHP Mongodb] Upsert

Pada suatu kasus kita membuat sebuah field yang uniq. Dimana ketika dari field yang uniq tersebut ada nilai yang sama, maka opsinya adalah kita harus tidak dilakukan penyimpanan, tetapi pembaharuan data (update). Sebagai contoh kasus, kita memiliki colection “member” dimana memiliki field “id”,”email”,”name”,”address”. We make field “email” uniq and we save a data like this :

 $varvalue = array(
                'email' => 'youremail@email.com',
                'name' => 'Your Name',
                'address'=>'Your Address',
            );
            $collection->insert($varvalue,array('safe'=>true));

Lalu kita ingin menyimpan data lagi yang ternyata memiliki alamat email yang sama dengan data sebelumnya. Yah, maka dari itu kita harus membuat mekanisme kembali dimana mekanisme nya adalah :

if(email is unique)
   insert new data
else
   update old data that have same email

Yah, itulah mekanismenya. Tapi pada mongodb, kita tidak perlu repot memikirkan mekanisme tersebut. Telah ada sebuah operas bernama “upsert” yang akans secara otomatis menjalankan mekanisme tersebut. Berikut contoh codenya :

 
            $varvalue = array(
                'name' => 'Your Name',
                'address' => 'Your Address',
            );
            $collection->update(array('email' =>'youremail@email.com'),$varvalue,array('upsert'=>True));

You can see that we have “upsert”=>True in the update code. Itu artinya fungsi update tersebut akan menjalankan mekanisme berikut :

if(there's data that have same email)
    update old data that have same email with new "name" and "address"
else
    insert new data with "email", "name", and "address"

Finish.. Happy coding..

[ Yii Framework + MongoDb ] Update And Delete Data

Melanjutkan postingan sebelumnya di https://sabitlabscode.wordpress.com/2013/06/28/yii-framework-mongodb-select-collection-and-view/ sekarang kita akan mencoba membuat fungsi update dan delete. After all at least we can create a CRUD operation in Mongodb. Baiklah, pertama-tama mari kita create fungsi di model untuk mengeksekusi perintah update dan delete. Masukkan fungsi berikut pada model anda :

     public function editmongo($id) // udpdate data
    {
        try {
            $connection = new Mongo();
            $database = $connection->selectDB('belajar');
            $collection = $database->selectCollection('siswa');
            //insert some value that we will change
            $varsiswa = array(
                'name' => $this->name,
                'jk' => $this->jk,
                'kota'=>$this->kota,
                'alamat'=>$this->alamat,
                'createddate' => new MongoDate()
            );
            //update data with parameter "_id" and insert value.
            $collection->update(array('_id' => new MongoId($id)),$varsiswa);
            return true;
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die('Failed to update data '.$e->getMessage());
        }
    }

    // function to delete data
    public function deletemongo($id)
    {    
        try {
            $connection = new Mongo();
            $collection = $connection->belajar->siswa;
            //delete data by document "_id"
            $collection->remove(array('_id'=>new MongoId($id)));
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die('Failed to do operation '.$e->getMessage());
        }
    }

Setelah itu mari kita buat action pada controller dimana action inilah yang akan dijalankan untuk melakukan request. Pada controller masukkan code berikut :

     public function actionUpdate($id)
    {
        $model=new SiswaForm;
        $data=$model->findOneById($id);
        $model->name=$data['name'];
        $model->jk=$data['jk'];
        $model->kota=$data['kota'];
        if(isset($data['alamat']))
            $model->alamat=$data['alamat'];

        if(isset($_POST['SiswaForm']))
        {
            $model->name=$_POST['SiswaForm']['name'];
            $model->jk=$_POST['SiswaForm']['jk'];
            $model->kota=$_POST['SiswaForm']['kota'];
            $model->alamat=$_POST['SiswaForm']['alamat'];
            if($model->validate())
            {
                if($model->editmongo($id))
                {
                    $this->redirect(array('index'));
                }
            }
        }
        $this->render('siswa',array('model'=>$model));    
    }

    public function actionDelete($id)
    {
        $model= new SiswaForm;
        $model->deletemongo($id);
        $this->redirect(array('index'));
    }

Dapat kita lihat pada action update dia me render halaman sedangkan delete tidak. Karena pada update me render halaman “siswa”, sedangkan halaman siswa sendiri sudah ada pada actionSiswa yang telah dibuat pada postingan sebelumnya. Jalankan fungsi tersebut..

Selesai.. happy coding…

%d bloggers like this: