Hướng dẫn connect mongodb localhost

Nội dung bài viết

Video học lập trình mỗi ngày

Connect server MongoDB từ xa hay từ một server khác đó là một mô hình bình thường hiện nay. Bài viết này sẽ hướng dẫn cho người mới làm quen với mongodb có thể làm được điều mà chỉ có những chuyên về admin mới làm được.

Bài viết này có trong Series - Mongodb.

Để hiểu được và có thể thao tác được, trước tiên tôi mong muốn về cơ bản, bạn phải hiểu MongoDB là gì? Và đương nhiên là phải có những thao tác trên LINUX.

Bài học này bạn được những gì?

  • Cách tạo một database và tạo quyền truy cập vào db trên Mongoodb.
  • Cách cho phép mọi ip address connect từ xa tới MongoDB
  • Chỉ cho phép một số ip address truy cập từ xa tới MongoDB

MongoDB create user

Đầu tiên chính xác là bạn truy cập và ssh, và tạo một user trên mongodb mà chúng ta đã nói đến ở Mongodb create database and user terminal:

> db.createUser( 
  {
    user: "new_user",
    pwd: "some_password",
    roles: [ { role: "readWrite", db: "anonystick" } ]
  }
)

Enable MongoDB Auth

Đến bước này thì việc duy nhất là bạn tìm tới file config mongodb /etc/mongod.conf. Sau đó sửa file này như sau:

sudo vim /etc/mongod.conf

Sau khi mở ra thì tìm đến line này:

# network interfaces
net:
    port: 27017
    bindIp: 127.0.0.1

bindIp: chính là nơi chứa những ip address được cho phép truy cập. Mặc định là chỉ có connect bằng localhost.Đến đây không thể không nhắc đến vấn đề bảo mật trong mongodb, đó là mỗi lần config vui lòng backup mongodb sử dụng mongodump. Cẩn thận trên hết nhé các đồng chí.

Warning: Đừng có comment lại #bindIp. Nếu bạn làm như vậy đồng nghĩa với việc bạn sẽ cho phép tất cả các nơi truy cập vào admin MongoDB của bạn.

Giờ bạn muốn thêm một Server A truy cập đến Server chứa MongoDB thì hãy làm như sau: Đầu tiên bạn phải làm là sử dụng lệnh:

anonystick:~# ip a |grep net
    inet 127.0.0.1/3 scope host lo
    inet6 xxxx scope host 
    inet 12.13.14.15/23 brd xxxxx scope global dynamic ens3
    inet6 xxxxx/64 scope link

Để làm gì? Để bạn có thể thấy được ip address đang xài là gì? Ở đây chính là dòng thứ 3 12.13.14.15. Khi lấy được rồi bạn sửa lại file config trên như tôi đã nói :

# network interfaces
net:
    port: 27017
    bindIp: 127.0.0.1,12.13.14.15

Nghĩa là server khác sẽ truy cập và connect mongodb qua 12.13.14.15 này.

Restart mongo daemon (mongod)

Sau khi edit thành công thì đương nhiên phải reload lại mongo.

sudo service mongod restart

Sau đó check lệnh mongo lên xem. Hoặc bạn có thể sử dụng

tail -f /var/log/mongodb/mongod.log

Để theo dõi log...

Kết nối mongodb từ xa Và sau cùng là ta lấy server A connect tới bằng nhiều cách như Connect mongodb Nodejs, nhưng ở đâu tôi dùng Sell cho nhanh:

mongo -u ian -p secretPassword 12.13.14.15/abc

MongoDB security

Ở đây 12.13.14.15 chính là ip mình đã config ở trên kia. Tới bước này rồi, có thể là tạm thời nói rằng bạn đã thành công. Nhưng còn một chuyện đó là vấn đề bảo mật. Có ai đặt câu hỏi rằng, nếu như vậy thì tất cả có thể truy cập vào database từ xa, cho dù là ai? Đúng là như vậy, chính vì vậy một bước cuối cùng để MongoDB security chính là phải cấu hình lại, ip address nào được phép truy cập. Đó là việc điều chỉnh lại Firewall trong hệ thống. Bài viết này đã dài, cho nên tôi nghĩ sẽ để vấn đề này cho một bài viết khác có tên là "Adjusting the Firewall'.

Và đó là tất cả bài hướng dẫn của chủ đề ngày hôm nay. Xin chào!

Trong bài viết này chúng ta sẽ đi tìm hiểu làm thế nào để sử dụng MongoDB với Nodejs. MongoDB là một NoSQL, hiểu suất cao rất nổi tiếng, nó được xây dựng với ý tưởng dựa trên cấu trúc document.

Trong MongoDB, dữ liệu được lưu trữ như một document, một tập của các cặp key-value. Bạn có thể định nghĩa nhiều database trong MongoDB và mỗi database có nhiều collections, những collections này đơn giản là tập của các documents được lưu trữ dạng cặp key-value.

Cấu trúc dữ liệu định nghĩa document được gọi là BSON(Binary JSON). BSON là một dạng nhị phân của JSON và cũng hỗ trợ những kiểu dữ liệu như Date, những kiểu mà không được hỗ trợ trong định dạng JSON. MongoDB sẽ chuyển đổi JSON tới BSON và đổi lại lợi ích hiệu suất cao, mặc dù người dùng có thể save, query và nhận dữ liệu như JSON.

1. Tạo kết nối với MongoDB trong NodeJs

Để làm việc với database, đầu tiên bạn cần tạo một kết nối. Trong mục này của bài viết, chúng ta sẽ sử dụng 'native NodeJs drivers' của MongoDB để tạo kết nối với MongoDB server. Để cài đặt driver của MongoDB, sử dụng lệnh npm. Sau đó, chạy lệnh bên dưới trong thư mục dự án của bạn

 > npm install mongodb

Tiếp theo, bạn nên tạo một file js trắng trong thư mục dự án và viết đoạn code như bên dưới:

//lets require/import the mongodb native drivers.
var mongodb = require('mongodb');

//We need to work with "MongoClient" interface in order to connect to a mongodb server.
var MongoClient = mongodb.MongoClient;

// Connection URL. This is where your mongodb server is running.
var url = 'mongodb://localhost:27017/my_database_name';

// Use connect method to connect to the Server
MongoClient.connect(url, function (err, db) {
  if (err) {
    console.log('Unable to connect to the mongoDB server. Error:', err);
  } else {
    //HURRAY!! We are connected. :)
    console.log('Connection established to', url);

    // do some work here with the database.

    //Close connection
    db.close();
  }
});

Bây giờ giả sử rằng database của bạn là đang chạy trên một url được đề cập ở trên (mongodb://localhost:27017/my_database_name) và tiếp theo chạy file này với node, chúng ta sẽ có thể kết nối tới database server.

Ok, phân tích những code trên, chúng ta chia chương trình thành những bước hợp lý sau:

  • Load mongodb module: Chúng ta yêu cầu để load mongodb module trong code của chúng ta. MongoDB sẽ biểu diễn 'native mongodb dỉivers' cho Node.js.
    //lets require/import the mongodb native drivers.
      var mongodb = require('mongodb');
  • Định nghĩa url cần để kết nối tới: Chúng ta cần để biết nơi mà mongodb server đang chạy. Url chỉ ra nơi đặt instance của mongodb đang chạy, server mà chúng ta có thể kết nối đến nó. Url cũng bao gồm tên database mà chúng ta dự định kết nối đến.
    // Connection URL. This is where your mongodb server is running.
      var url = 'mongodb://localhost:27017/my_database_name';
  • Kết nối tới database: Hãy sử dụng MongoClient interface để kết nối đến database. Trong hàm callback chúng ta nhận error hoặc db object. Chúng ta sử dụng db object để giao tiếp với database.
    //We need to work with "MongoClient" interface in order to connect to a mongodb server.
      var MongoClient = mongodb.MongoClient;

      // Use connect method to connect to the Server
      MongoClient.connect(url, function (err, db) {
        if (err) {
          console.log('Unable to connect to the mongoDB server. Error:', err);
        } else {
          //HURRAY!! We are connected. :)
          console.log('Connection established to', url);

          // do some work here with the database.

          //Close connection
          db.close();
      }

2. Thêm, sửa và lấy dữ liệu trên MongoDB

Bây giờ bạn có một kết nối db đã sẵn sàng, hãy quan sát làm thế nào chúng ta có thể thực hiện một vài thao tác cơ bản trên MongoDB.

Có hai điều cần quan tâm khi sử dụng mongodb native driver:

  • Tên truy vấn và tham số của chúng là tương tự như những lệnh mongodb gốc.
  • Tất cả những hàm truy vấn này nắm giữ hàm callback là đối số cuối cùng. Hàm callback đối xử tham số đầu tiên như error và tham số thứ hai như kết quả thành công. Kết quả là là kết quả hay đầu ra được cung cấp bởi mongodb đang chạy những lệnh này. Nó là quen thuộc với những gì bạn thấy nếu bạn đã chạy những truy vấn này trên mongodb shell.

2.1 Insert

Hãy giả sử rằng chúng ta cần để tạo một tập hợp các users và lưu một vài users. Ví dụ chúng ta sử dụng hàm insert để lưu thông tin user.

//lets require/import the mongodb native drivers.
var mongodb = require('mongodb');

//We need to work with "MongoClient" interface in order to connect to a mongodb server.
var MongoClient = mongodb.MongoClient;

// Connection URL. This is where your mongodb server is running.
var url = 'mongodb://localhost:27017/my_database_name';

// Use connect method to connect to the Server
MongoClient.connect(url, function (err, db) {
  if (err) {
    console.log('Unable to connect to the mongoDB server. Error:', err);
  } else {
    //HURRAY!! We are connected. :)
    console.log('Connection established to', url);

    // Get the documents collection
    var collection = db.collection('users');

    //Create some users
    var user1 = {name: 'modulus admin', age: 42, roles: ['admin', 'moderator', 'user']};
    var user2 = {name: 'modulus user', age: 22, roles: ['user']};
    var user3 = {name: 'modulus super admin', age: 92, roles: ['super-admin', 'admin', 'moderator', 'user']};

    // Insert some users
    collection.insert([user1, user2, user3], function (err, result) {
      if (err) {
        console.log(err);
      } else {
        console.log('Inserted %d documents into the "users" collection. The documents inserted with "_id" are:', result.length, result);
      }
      //Close connection
      db.close();
    });
  }
});

Trong code trước chúng ta đã làm theo các bước sau:

  • Nhận tham chiếu của collection 'users': Chúng ta đã sử dụng phương thức db.collection để nhận tham chiếu của bảng 'users' (hay còn gọi là users collection). Nếu collection chưa tồn tại, tiếp theo nó sẽ được tạo mới trước khi insert. Nếu nó đã tồn tại, bạn sẽ làm việc trên cái đó. Bạn không cần để một lệnh riêng biệt tạo một collection.
    // Get the documents collection
      var collection = db.collection('users');
  • Chuẩn bị dữ liệu thêm mới: Chúng ta đã tạo một vài ví dụ đối tượng bản ghi user, được đặt tên là user1, user2 và user3. Cấu trúc của document là không cố định, chúng đơn giản là những đối tượng JS với dữ liệu của entity.

  • Thêm mới tới database: Chúng ta đã sử dụng phương thức collection.insert để thêm mới dữ liệu trong collection của database. Chúng ta đã truyền một mảng của users và nó được lưu tất cả chúng trong một bước. Nếu chúng ta cần lưu chỉ một document (1 thông tin user), thì chúng ta có thể truyền trong hàm insert mình user đó, ví dụ collection.insert(user1, callback).

      // Insert some users
      collection.insert([user1, user2, user3], function (err, result) {
        if (err) {
          console.log(err);
       } else {
          console.log('Inserted %d documents into the "users" collection. The documents inserted with "_id" are:', result.length, result);
        }
        //Close connection
        db.close();
      });
  • Callback: Hàm callback cho phương thức insert có hai tham số, đầu tiên là error và còn lại là result. Nếu có một lỗi, tiếp theo đối tượng lỗi sẽ có error chi tiết hoặc ngược lại sẽ là null. Result sẽ là một mảng các documents đã được lưu.

2.2 Update

Để cập nhật những bản ghi chúng ta sử dụng hàm collection.update. Tên và các tham số của hàm update là tương tự những truy vấn gốc của mongodb. Hãy quan sát một ví dụ bên dưới:

// Get the documents collection
var collection = db.collection('users');

// Insert some users
collection.update({name: 'modulus user'}, {$set: {enabled: false}}, function (err, numUpdated) {
  if (err) {
    console.log(err);
  } else if (numUpdated) {
    console.log('Updated Successfully %d document(s).', numUpdated);
  } else {
    console.log('No document found with defined "find" criteria!');
  }
  //Close connection
  db.close();
});

2.3 Query

Tiếp theo, hãy lấy dữ những documents từ mongodb. Để làm điều này chúng ta có thể gọi hàm find trên đối tượng collection như chúng ta làm trên mongodb shell. Đây là một ví dụ:

//lets require/import the mongodb native drivers.
var mongodb = require('mongodb');

//We need to work with "MongoClient" interface in order to connect to a mongodb server.
var MongoClient = mongodb.MongoClient;

// Connection URL. This is where your mongodb server is running.
var url = 'mongodb://localhost:27017/my_database_name';

// Use connect method to connect to the Server
MongoClient.connect(url, function (err, db) {
  if (err) {
    console.log('Unable to connect to the mongoDB server. Error:', err);
  } else {
    //HURRAY!! We are connected. :)
    console.log('Connection established to', url);

    // Get the documents collection
    var collection = db.collection('users');

    // Insert some users
    collection.find({name: 'modulus user'}).toArray(function (err, result) {
      if (err) {
        console.log(err);
      } else if (result.length) {
        console.log('Found:', result);
      } else {
        console.log('No document(s) found with defined "find" criteria!');
      }
      //Close connection
      db.close();
    });
  }
});

Ví dụ trên bạn có thể thấy chúng ta đã sử dụng .toArray được nối với find bởi vì việc chạy hàm find chỉ trả về một con trỏ db. Tiếp theo chúng ta phải lặp trên con trỏ và lấy kết quả trả về. Lý do cho điều này là vì hiệu suất, mặc định mongodb không lấy đầy đủ bản ghi dữ liệu. Việc sử dụng toArray nói driver rằng chúng ta muốn đầy đủ dữ liệu của mỗi user, cái mà tiếp theo được trả về.

3. Làm việc với MongoDB sử dụng module Mongoose ODM trong Node.js

MongooseJS là một thư việc rất phổ biến trong Node.js, thư viện này cung cấp một sự rành mạch, giải pháp schema-based để đối tượng hóa dữ liệu ứng dụng của bạn và bao gồm built-in type casting, validation, query, building, business logic và nhiều thứ khác. Việc sử dụng mongoose bạn có thể làm việc với mongodb giống như một chuyên gia. Mongoose đơn giản để làm việc với mongodb và tăng độ tin cậy với những tính năng tự đông kết nối và quản lý connection pool. Để làm việc với mongoose chúng ta cần cài đặt module mongoose, dùng lệnh:

> npm install mongoose

Bây giờ, chúng ta sẽ cố gắng viết lại những ví dụ ở trên sử dụng mongoose

//Lets load the mongoose module in our program
var mongoose = require('mongoose');

//Lets connect to our database using the DB server URL.
mongoose.connect('mongodb://localhost/my_database_name');

/**
 * Lets define our Model for User entity. This model represents a collection in the database.
 * We define the possible schema of User document and data types of each field.
 * */
var User = mongoose.model('User', {name: String, roles: Array, age: Number});

/**
 * Lets Use our Models
 * */

//Lets create a new user
var user1 = new User({name: 'modulus admin', age: 42, roles: ['admin', 'moderator', 'user']});

//Some modifications in user object
user1.name = user1.name.toUpperCase();

//Lets try to print and see it. You will see _id is assigned.
console.log(user1);

//Lets save it
user1.save(function (err, userObj) {
  if (err) {
    console.log(err);
  } else {
    console.log('saved successfully:', userObj);
  }
});

Trong code trên chúng ta đã làm theo những bưowcs sau:

  • Kết nối tới database: Chúng ta đã sử dụng hàm mongoose.connect để kết nối database. MongooseJS tiếp theo sẽ xử lý connection và connection pool như đã cấu hình.
  • Tạo Model: Chúng ta tạo một Model sử dụng hàm mongoose.model. Model biểu diễn một collection trong database. Tên mà chúng ta cung cấp sẽ được ngầm định số nhiều hóa. Ví dụ, trong trường hợp của chúng ta nếu tên của model là User, thì collection sẽ có tên là users (chữ thường). Chúng ta cũng định nghĩa schema cho document trong xử lý này.
    var User = mongoose.model('User', {name: String, roles: Array, age: Number});
  • Tạo mới đối tượng User: Chúng ta đã tạo một đối tượng user mới sử dụng model của chúng ta. Chúng ta có thể tạo nhiều đối tượng usẻ sử dụng model, và mỗi đối tượng sẽ trình diễn một document trong database.
    //Lets create a new user
    var user1 = new User({name: 'modulus admin', age: 42, roles: ['admin', 'moderator', 'user']});
    //Some modifications in user object
    user1.name = user1.name.toUpperCase();
  • Lưu user sử dụng hàm 'save': Mongoose model có nhiều phương thức sẵn có trên đối tượng entity. Trong trường hợp này, chúng ta đã sử dụng phương thức save để lưu document trong database. Chúng ta cũng có thể sử dụng Model để query database. Để query collection chúng ta có thể sử dụng Model đã định nghĩa để làm điều đó. Hãy xem ví dụ bên dưới:
    //Lets load the mongoose module in our program
    var mongoose = require('mongoose');

    //Lets connect to our database using the DB server URL.
    mongoose.connect('mongodb://localhost/my_database_name');

    /**
     * Lets define our Model for User entity. This model represents a collection in the database.
     * We define the possible schema of User document and data types of each field.
     * */
    var User = mongoose.model('User', {name: String, roles: Array, age: Number});

    //Lets try to Find a user
    User.findOne({name: 'modulus admin'}, function (err, userObj) {
      if (err) {
        console.log(err);
      } else if (userObj) {
        console.log('Found:', userObj);

        //For demo purposes lets update the user on condition.
        if (userObj.age != 30) {
          //Some demo manipulation
          userObj.age += 30;

          //Lets save it
          userObj.save(function (err) {
            if (err) {
              console.log(err);
            } else {
              console.log('Updated', userObj);
            }
          });
        }
      } else {
        console.log('User not found!');
      }
    });

Để có thêm thông tin về Mongoose bạn có tham khảo ở website mongoosejs.com

4. Kết

Trong bài viết này các bạn đã học làm thế nào sử dụng được MongoDB Node.js drivers để tương tác với database. Chúng ta đã thấy làm thế nào để insert/update/query và sử dụng db cursors một cách cơ bản. Đồng thời bạn cũng có một hiểu biết sơ bộ về MongooseJS. Hy vọng những điều này sẽ giúp ích cho các bạn.

Tham khảo:

NODE.JS TUTORIAL: USING MONGODB