MongoDB and CodeIgniter

PhpCodeigniterMongodbMongodb Php

Php Problem Overview


Can anyone assist in pointing me to a tutorial, library, etc. that will allow me to work with MongoDB from CodeIgniter?

Php Solutions


Solution 1 - Php

I'm not sure if its the "CodeIgniter way" but I created a CodeIgniter library that extends the Mongo class with an extra property to store the current database connection.

Here are the relevant code files from my project.

config/mongo.php

$config['mongo_server'] = null;
$config['mongo_dbname'] = 'mydb';

libraries/Mongo.php

class CI_Mongo extends Mongo
{
    var $db;

    function CI_Mongo()
    {	
	    // Fetch CodeIgniter instance
	    $ci = get_instance();
	    // Load Mongo configuration file
	    $ci->load->config('mongo');
	
	    // Fetch Mongo server and database configuration
	    $server = $ci->config->item('mongo_server');
	    $dbname = $ci->config->item('mongo_dbname');
	
	    // Initialise Mongo
	    if ($server)
	    {
		    parent::__construct($server);
	    }
	    else
	    {
		    parent::__construct();
	    }
	    $this->db = $this->$dbname;
    }
}

And a sample controller

controllers/posts.php

class Posts extends Controller
{
    function Posts()
    {
	    parent::Controller();
    }

    function index()
    {
	    $posts = $this->mongo->db->posts->find();
	
	    foreach ($posts as $id => $post)
	    {
		    var_dump($id);
		    var_dump($post);
	    }
    }

    function create()
    {
	    $post = array('title' => 'Test post');
	    $this->mongo->db->posts->insert($post);
	    var_dump($post);
    }
}

Solution 2 - Php

MongoDB is very well supported within CodeIgniter community, take the time and dive in :p

Solution 3 - Php

I like Stephen Curran's example as it is simple and allows an interface to Mongo without too much functionality written within Php, I tend to find huge abstraction clases a bit much at times for what I am after.

I have extended his example to include database authentication. Go here: http://www.mongodb.org/display/DOCS/Security+and+Authentication to read about mongo authentication, don't forget to enable authentication for the Mongo Server you are connecting to.

I have also changed the old style constructor function to be __construct and am handling Mongo Connection Exceptions as they can reveal your username and password.

config/mongo.php
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

$config['mongo_server'] = 'localhost';
$config['mongo_dbname'] = 'my_mongo_db';
$config['mongo_username'] = 'mongo_user';
$config['mongo_password'] = 'password1234';

/* End of file mongo.php */
libraries/Mongo.php
<?php

class CI_Mongo extends Mongo{

    protected $db;

    function __construct()
    {   
        // Fetch CodeIgniter instance
        $ci = get_instance();
        // Load Mongo configuration file
        $ci->load->config('mongo');

        // Fetch Mongo server and database configuration
        $server = $ci->config->item('mongo_server');
        $username = $ci->config->item('mongo_username');
        $password = $ci->config->item('mongo_password');
        $dbname = $ci->config->item('mongo_dbname');
    
        // Initialise Mongo - Authentication required
        try{
            parent::__construct("mongodb://$username:$password@$server/$dbname");
            $this->db = $this->$dbname;
        }catch(MongoConnectionException $e){
            //Don't show Mongo Exceptions as they can contain authentication info
            $_error =& load_class('Exceptions', 'core');
            exit($_error->show_error('MongoDB Connection Error', 'A MongoDB error occured while trying to connect to the database!', 'error_db'));           
        }catch(Exception $e){
            $_error =& load_class('Exceptions', 'core');
            exit($_error->show_error('MongoDB Error',$e->getMessage(), 'error_db'));           
        }
    }
}

Solution 4 - Php

Working with MongoDB in CodeIgniter wouldn't be much different than working with it anywhere else.

You could knock together a MongoDB library that would connect in the constructor and store $this->conn to be used in methods later on.

then either work directly with the conn property in your controllers or create a few methods in your MongoDB library to do this for you.

Take a look here to see the plain PHP tutorial for working with MongoDB.

I'd happily create you a library for this but it would come with a price. :-p

Solution 5 - Php

I'm using MongoDB w/ CI and came up with the following. It works for me, but I'm sure it can be tweaked somewhat. I'll worry about tweaking it later but right now it does what I want.

I created a model called "database_conn.php"

class Database_Conn extends Model {

    function _connect() {
    	$m = new Mongo();

    	$db = $m->selectDB( "YOUR DATABASE NAME" );
    	return $db;
    }
}

Then, if I need to connect to a collection from my models.

$collection = Database_Conn::_connect()->selectCollection( "COLLECTION NAME" );

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionIEnumeratorView Question on Stackoverflow
Solution 1 - PhpStephen CurranView Answer on Stackoverflow
Solution 2 - PhpsepehrView Answer on Stackoverflow
Solution 3 - PhpLuke TarplinView Answer on Stackoverflow
Solution 4 - PhpPhil SturgeonView Answer on Stackoverflow
Solution 5 - Phpsdot257View Answer on Stackoverflow