Hướng dẫn lập trình Java với MongoDB
Công ty Vĩnh Cửu tuyển dụng lập trình viên Java

1- Giới thiệu

Tài liệu được viết dựa trên:
  • MongoDB 2.6.4

2- Một số khái niệm của MongoDB

Trước hết chúng ta cần hiểu một số khái niệm trong MongoDB:
  • Khái niệm Collection trong MongoDB nó tương ứng với khái niệm Table (bảng) trong cơ sở dữ liệu quan hệ.
  • Khái niệm Document trong MongoDB nó tương ứng với khái niệm Record (bản ghi) trong cơ sở dữ liệu quan hệ.
MongoDB rất linh hoạt, đôi khi bạn kết nối vào một Database hoặc Collection mà không nhất thiết rằng nó tồn tại, nó sẽ được tự động tạo ra khi bạn có một thao tác nào đó. Điều này sẽ được giải thích trong các ví dụ liên quan của tài liệu này.

3- Vấn đề trọng tâm

Bạn cần có một cái nhìn trọng tâm vào cách sử lý Java với Database MongoDB để có cách tiếp cận tốt nhất.
Khi bạn làm việc với một cơ sở dữ liệu, câu hỏi của bạn luôn là làm thế nào tôi có thể truy vấn, insert, update và delete dữ liệu.
MongoDB không có khái niệm truy vấn Join giữa 2 Collection với nhau, mọi việc truy đều là truy vấn trên một Collection. Và như vậy bạn chẳng cần phải học làm thế nào để Join 2 Collection, mọi thứ chỉ còn là  viết điều kiện where cho một Collection. Cụ thể là:
  • Truy vấn ra dữ liệu thuộc điều kiện nào.
  • Update các Document thuộc vào điều kiện nào.
  • Delete các Document thuộc vào điều kiện nào.
Java cung cấp một class DBObject để mô tả một cấu trúc dữ liệu JSON, và nó mô tả điều kiện của câu truy vấn.

Hãy xem một số ví dụ:

Tìm kiếm các nhân viên có first_name = "John" và last_name = "Smith", JSON trong trường hợp này sẽ là:
Tìm các nhân viên có mã phòng 10 và mã nhân viên "E01", "E02", cấu trúc JSON bạn cần viết sẽ là:
Bạn cần phải học cách mà Java API tạo ra DBObject mô tả một điều kiện cho câu Query. Java cung cấp cho bạn một số class:
  • BasicDBObjectBuilder
  • QueryBuilder
Các class trên giống như một class tiện ích để tạo ra đối tượng DBObject.
  • TODO

4- Tạo mới Project

Trước hết bạn cần tạo một Project để thực hành các ví dụ.
  • File/New/Other...
Nhập vào:
  • Group Id: org.o7planning
  • Artifact Id: JavaMongoDBTutorial
Project đã được tạo ra:

5- Khai báo thư viện (Sử dụng Maven)

Cấu hình pom.xml
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>org.o7planning</groupId>
 <artifactId>JavaMongoDBTutorial</artifactId>
 <version>0.0.1-SNAPSHOT</version>


 <dependencies>
   
     <!--  http://mvnrepository.com/artifact/org.mongodb/mongo-java-driver  -->
     <dependency>
         <groupId>org.mongodb</groupId>
         <artifactId>mongo-java-driver</artifactId>
         <version>2.12.4</version>
     </dependency>
   
 </dependencies>


</project>

6- Kết nối vào MongoDB sử dụng Java

Đảm bảo rằng MongoDB của bạn đã sẵn sàng chạy.
Bạn có thể xem thêm cài đặt và cấu hình MongoDB tại:
MyConstants.java
package org.o7planning.tutorial.mongodb;

public class MyConstants {

  // Có thể Database này không tồn tại trên MongoDB của bạn.
  // Nhưng nó sẽ được tự động tạo ra.
  // (Bạn không cần phải thay đổi trường này).
  public static final String DB_NAME ="MyStudyDB";


}
Class MongoUtils với các method tiện ích để kết nối vào Database MongoDB. Trong thực hành bạn có thể thay đổi các thông số HOST, PORT, .. cho phù hợp với trường hợp của mình.
MongoUtils.java
package org.o7planning.tutorial.mongodb;

import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.List;

import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;

public class MongoUtils {

  private static final String HOST = "localhost";
  private static final int PORT = 27017;

  //
  private static final String USERNAME = "mgdb";
  private static final String PASSWORD = "1234";

  // Cách kết nối vào MongoDB không bắt buộc bảo mật.
  private static MongoClient getMongoClient_1() throws UnknownHostException {
      MongoClient mongoClient = new MongoClient(HOST, PORT);
      return mongoClient;
  }

  // Cách kết nối vào DB MongoDB có bảo mật.
  private static MongoClient getMongoClient_2() throws UnknownHostException {
      MongoCredential credential = MongoCredential.createMongoCRCredential(
              USERNAME, MyConstants.DB_NAME, PASSWORD.toCharArray());

      MongoClient mongoClient = new MongoClient(
              new ServerAddress(HOST, PORT), Arrays.asList(credential));
      return mongoClient;
  }

  public static MongoClient getMongoClient() throws UnknownHostException {
      // Kết nối vào MongoDB không bắt buộc bảo mật.
      return getMongoClient_1();
      // Bạn có thể thay thế bởi getMongoClient_2()
      // trong trường hợp kết nối vào MongoDB có bảo mật.
  }

  private static void ping() throws UnknownHostException {
      MongoClient mongoClient = getMongoClient();
     
      System.out.println("List all DB:");
     
      // Danh sách các DB Names.
      List<String> dbNames = mongoClient.getDatabaseNames();
      for (String dbName : dbNames) {
          System.out.println("+ DB Name: " + dbName);
      }

      System.out.println("Done!");
  }

  // Test
  public static void main(String[] args) throws UnknownHostException {
      ping();
  }
}
Chạy class MongoUtils để test kết nối:

7- Insert Collection

MongoDB rất linh hoạt, nếu bạn muốn trèn một bản ghi ( Document) vào một Collection. Nếu Collection này không tồn tại nó sẽ tự động được tạo ra, sau đó các bản ghi được trèn vào.
Trong ví dụ này chúng ta sẽ trèn 4 document vào Collection Department. Trong MongoDB cột _id chính là khóa chính ( Primary Key), trong trường hợp bạn trèn vào một tài  liệu (Document), mà không chỉ định rõ khóa chính, cột _id vẫn sẽ được tạo ra, với giá trị là một chuỗi ngẫu nhiên 36 ký tự.
{
"_id" : 10 ,
"dept_no" : "D10" ,
"dept_name" : "ACCOUNTING" ,
"location" : "NEW YORK"
}

{
"_id" : 20 ,
"dept_no" : "D20" ,
"dept_name" : "RESEARCH" ,
"location" : "DALLAS" ,
"description" : "First department"
}

{
"_id" : 30 ,
"dept_no" : "D30" ,
"dept_name" : "SALES" ,
"location" : "CHICAGO"
}

{
"_id" : 40 ,
"dept_no" : "D40" ,
"dept_name" : "OPERATIONS" ,
"location" : "BOSTON"
}
InsertDemo.java
package org.o7planning.tutorial.mongodb.insert;

import java.net.UnknownHostException;

import org.o7planning.tutorial.mongodb.MongoUtils;
import org.o7planning.tutorial.mongodb.MyConstants;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.MongoClient;

public class InsertDemo {

 public static void main(String args[]) throws UnknownHostException {

      // Kết nối tới MongoDB.
     MongoClient mongoClient = MongoUtils.getMongoClient();

     // Kết nối tới Database
     // (Không nhất thiết DB này phải tồn tại sẵn
     // nó sẽ được tự động tạo ra nếu chưa tồn tại).
     DB db = mongoClient.getDB(MyConstants.DB_NAME);

     // Lấy ra Collection với tên Department.
     // Không nhất thiết Collection này phải tồn tại trong DB.
     DBCollection dept = db.getCollection("Department");

     // Insert Document 1
     BasicDBObject doc1 = new BasicDBObject();
     doc1.append("_id", 10);
     doc1.append("dept_no", "D10");
     doc1.append("dept_name", "ACCOUNTING");
     doc1.append("location", "NEW YORK");
     dept.insert(doc1);

     // Insert Document 2

     BasicDBObject doc2 = new BasicDBObject();
     doc2.append("_id", 20);
     doc2.append("dept_no", "D20");
     doc2.append("dept_name", "RESEARCH");
     doc2.append("location", "DALLAS");
     doc2.append("description", "First department");
     dept.insert(doc2);

     // Insert Document 3
     BasicDBObject doc3 = new BasicDBObject();
     doc3.append("_id", 30);
     doc3.append("dept_no", "D30");
     doc3.append("dept_name", "SALES");
     doc3.append("location", "CHICAGO");
     dept.insert(doc3);

     // Insert Document 4
     BasicDBObject doc4 = new BasicDBObject();
     doc4.append("_id", 40);
     doc4.append("dept_no", "D40");
     doc4.append("dept_name", "OPERATIONS");
     doc4.append("location", "BOSTON");
     dept.insert(doc4);
   
     System.out.println("Done!");
 }
}
Chạy class InsertDemo.java và xem kết quả trên RoboMongo (Công cụ trực quan quản lý MongoDB).
Nếu database không tồn tại, nó sẽ được tạo ra. Nếu Collection chưa tồn tại nó cũng tự động được tạo ra. Đó chính là sự khác biệt của MongoDB với các loại Database quan hệ khác ( Oracle, MySQL, SQLServer...)

8- Collection

Khái niệm Collection trong MongoDB nó tương ứng với khái niệm Table (bảng) trong cơ sở dữ liệu quan hệ. Chúng ta xem một ví dụ lấy ra danh sách các Collection trong database:
GettingCollectionDemo.java
package org.o7planning.tutorial.mongodb.collection;

import java.net.UnknownHostException;
import java.util.List;
import java.util.Set;

import org.o7planning.tutorial.mongodb.MongoUtils;
import org.o7planning.tutorial.mongodb.MyConstants;

import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.MongoClient;

public class GettingCollectionDemo {

   public static void main(String[] args) throws UnknownHostException {

       MongoClient mongoClient = MongoUtils.getMongoClient();
       DB db = mongoClient.getDB(MyConstants.DB_NAME);

       // Collection trong MongoDB tương đương với Table trong
       // cơ sở dữ liệu quan hệ (Oracle, MySQL,SQLServer,..)
       DBCollection dept = db.getCollection("Department");
       
       System.out.println("Collection: "+ dept);
       
       // Số Document.
       // Chú ý: Document trong MongoDB tương ứng với 1 dòng
       // dữ liệu trong cơ sở dữ liệu quan hệ.
       long rowCount = dept.count();
       System.out.println(" Document count: "+ rowCount);
       
       System.out.println(" ------------ ");
       
       // Danh sách tất cả Các Collection.
       Set<String> collections = db.getCollectionNames();
       
       for(String coll: collections)  {
           System.out.println("Collection: "+ coll);
       }
       
   }

}
Kết quả chạy ví dụ:

9- Query Collection

9.1- Điều kiện truy vấn trong MongoDB

Hãy xem một vài trường hợp thiết lập điều kiện where (Đây là kiến thức thuần thúy của MongoDB)

9.1.1- Các toán tử so sánh trong MongoDB

$gt Khớp với các giá trị lớn hơn giá trị quy định trong truy vấn. (Greater than)
$gte Khớp với các giá trị lớn hơn hoặc bằng giá trị quy định trong truy vấn. (Greater than or Equals)
$in Khớp với bất kỳ giá trị nào nằm trong một tập hợp cho trước. (In)
$lt Khớp với các giá trị nhỏ hơn giá trị quy định trong truy vấn. (Less than)
$lte Khớp với các giá trị nhỏ hơn hoặc bằng giá trị quy định trong truy vấn. (Less than or Equals)
$ne Khớp với tất cả các giá trị khác với giá trị quy định trong truy vấn. (Not Equals)
$nin Khớp với bất kỳ giá trị nào không nằm trong một tập hợp cho trước. (Not in)

9.2- Java API cho truy vấn dữ liệu

// Một số method của class DBCollection cho việc truy vấn:

public DBCursor find(DBObject ref)


public DBCursor find(DBObject ref, DBObject keys)

9.3- Ví dụ truy vấn đơn giản

Ví dụ này chúng ta sẽ Query vào Collection Department lấy ra các Document.
SimpleQueryDemo.java
package org.o7planning.tutorial.mongodb.query;

import java.net.UnknownHostException;

import org.o7planning.tutorial.mongodb.MongoUtils;
import org.o7planning.tutorial.mongodb.MyConstants;

import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.MongoClient;

public class SimpleQueryDemo {

  public static void main(String args[]) throws UnknownHostException {
   
      // Kết nối tới MongoDB.
      MongoClient mongoClient = MongoUtils.getMongoClient();

      DB db = mongoClient.getDB(MyConstants.DB_NAME);

      DBCollection dept = db.getCollection("Department");

      // Truy vấn tất cả các object trong Collection.
      DBCursor cursor = dept.find();
      int i = 1;
      while (cursor.hasNext()) {
          System.out.println("Document: " + i);
          System.out.println(cursor.next());
          i++;
      }

  }
}
Kết quả chạy ví dụ:
Document: 1
{ "_id"  : 10 , "dept_no" : "D10" , "dept_name" : "ACCOUNTING" , "location" : "NEW YORK"}
Document: 2
{ "_id" : 20 , "dept_no" : "D20" , "dept_name" : "RESEARCH" , "location" : "DALLAS" , "description" : "First department"}
Document: 3
{ "_id"  : 30 , "dept_no" : "D30" , "dept_name" : "SALES" , "location" : "CHICAGO"}
Document: 4
{ "_id" : 40 , "dept_no" : "D40" , "dept_name" : "OPERATIONS" , "location" : "BOSTON"}

9.4- Ví dụ truy vấn có điều kiện (1)

Để tạo ra các đối tượng DBObject bạn có thể sử dụng BasicDBObjectBuilder ví dụ:
BasicDBObjectBuilder whereBuilder = BasicDBObjectBuilder.start();
whereBuilder.append("dept_name", "ACCOUNTING");
//
DBObject where  = whereBuilder.get();
       
// Query
DBCursor cursor = dept.find(where);
Hãy xem ví dụ query Collection Department, tìm các phòng ban có dept_name = 'ACCOUNTING'.
QueryWithParamsDemo1.java
package org.o7planning.tutorial.mongodb.query;

import java.net.UnknownHostException;

import org.o7planning.tutorial.mongodb.MongoUtils;
import org.o7planning.tutorial.mongodb.MyConstants;

import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;

public class QueryWithParamsDemo1 {

   // Xây dựng JSON:
   // { "dept_name" : "ACCOUNTING"}
   private static DBObject getWhereClause_1() {
       BasicDBObjectBuilder whereBuilder = BasicDBObjectBuilder.start();

       // Sử dụng method append (cũng giống với dùng add)
       whereBuilder.append("dept_name", "ACCOUNTING");
       //
       DBObject where = whereBuilder.get();
       System.out.println("Where: " + where.toString());
       return where;
   }

   public static void main(String args[]) throws UnknownHostException {

       // Kết nối tới MongoDB.
       MongoClient mongoClient = MongoUtils.getMongoClient();
     
       DB db = mongoClient.getDB(MyConstants.DB_NAME);

       DBCollection dept = db.getCollection("Department");

       DBObject where = getWhereClause_1();

       // Truy vấn theo điều kiện.
       DBCursor cursor = dept.find(where);
       int i = 1;
       while (cursor.hasNext()) {
           System.out.println("Document: " + i);
           System.out.println(cursor.next());
           i++;
       }

       System.out.println("Done!");
   }
}
Kết quả chạy ví dụ:

9.5- Ví du truy vấn có điều kiện (2)

Ví dụ tiếp theo sử dụng BasicDBObjectBuilder. Bạn có thể dễ dàng biết sử dụng của nó theo hình minh họa dưới đây:

Chú ý: Hai method add append trong BasicDBObjectBuilder là tương đương nhau.

QueryWithParamsDemo2.java
package org.o7planning.tutorial.mongodb.query;

import java.net.UnknownHostException;
import java.util.regex.Pattern;

import org.o7planning.tutorial.mongodb.MongoUtils;
import org.o7planning.tutorial.mongodb.MyConstants;

import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;

//
// Tìm các Department theo SQL
// where dept_name like '%S%' and description is null
//
public class QueryWithParamsDemo2 {

 
  // dept_name like '%S%' and description is null
  // Xây dựng JSON:
  // { "dept_name" : { "$regex" : ".*S.*"} , "description" : null }
  public static DBObject getWhereClause_1() {

      BasicDBObjectBuilder whereBuilder = BasicDBObjectBuilder.start();
     
      // Sử dụng append và add là giống nhau.
      whereBuilder.push("dept_name").add("$regex", ".*S.*") ;
      whereBuilder.pop();
      whereBuilder.append("description", null);
      //
      DBObject where = whereBuilder.get();
      System.out.println("Where " + where.toString());
      return where;
  }
 
  // dept_name like '%S%' and description is null
  // Xây dựng JSON:
  // { "dept_name" : { "$regex" : ".*S.*"} , "description" : null }
  public static DBObject getWhereClause_2() {

      BasicDBObjectBuilder whereBuilder = BasicDBObjectBuilder.start();

      // Biểu thức chính quy mô tả một chuỗi.
      // Bắt đầu bởi ký tự bất kỳ xuất hiện 0 hoặc nhiều lần
      // Tiếp theo là ký tự S.
      // Và tiếp theo là ký tự xuất hiện 0 hoặc nhiều lần.
      String regex = ".*S.*";
      Pattern pattern = Pattern.compile(regex);

      whereBuilder.append("dept_name", pattern);
      whereBuilder.append("description", null);
      //
      DBObject where = whereBuilder.get();
      System.out.println("Where: " + where.toString());
      return where;
  }

  public static void main(String args[]) throws UnknownHostException {
 
      // Kết nối tới MongoDB.
      MongoClient mongoClient = MongoUtils.getMongoClient();

      DB db = mongoClient.getDB(MyConstants.DB_NAME);

      DBCollection dept = db.getCollection("Department");

      DBObject where = getWhereClause_1();

      // Truy vấn theo điều kiện.
      DBCursor cursor = dept.find(where);
      int i = 1;
      while (cursor.hasNext()) {
          System.out.println("Document: " + i);
          System.out.println(cursor.next());
          i++;
      }

      System.out.println("Done!");
  }
}
Kết quả chạy ví dụ:

9.6- Ví dụ truy vấn có điều kiện (3)

QueryWithParamsDemo3.java
package org.o7planning.tutorial.mongodb.query;

import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;

import org.o7planning.tutorial.mongodb.MongoUtils;
import org.o7planning.tutorial.mongodb.MyConstants;

import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.QueryBuilder;

//
// Tìm các Department tương ứng với SQL:
// where dept_name in ('ACCOUNTING', 'RESEARCH') or location  = 'BOSTON'.
//
public class QueryWithParamsDemo3 {

   // Cách 1:
   // Viết điều kiện where theo cách thông thường.
   // So với sử dụng QueryBuilder cách này khó hơn.
   
   // dept_name in ('ACCOUNTING', 'RESEARCH') or location  = 'BOSTON'.
   // { "$or" : [ { "dept_name" : { "$in" : [ "ACCOUNTING" , "RESEARCH"]}} , {"location" : "BOSTON"}]}
   protected static DBObject getWhereClase_1() {
       List<String> list = new ArrayList<String>();
       list.add("ACCOUNTING");
       list.add("RESEARCH");

       //
       BasicDBObjectBuilder ob1 = BasicDBObjectBuilder.start();
       ob1.push("dept_name").add("$in", list);
       DBObject clause1 = ob1.get();
       //
       BasicDBObjectBuilder ob2 = BasicDBObjectBuilder.start();
       ob2.append("location", "BOSTON");
       DBObject clause2 = ob2.get();
       //
       BasicDBList or = new BasicDBList();
       or.add(clause1);
       or.add(clause2);
       //
       BasicDBObjectBuilder builder = BasicDBObjectBuilder.start();
       builder.add("$or", or);
       DBObject query = builder.get();
       System.out.println("Query = " + query);
       return query;
   }

   // Cách 2:
   // Viết điều kiện where sử dụng QueryBuilder.
   // Sử dụng QueryBuilder luôn luôn dễ dàng hơn.
   // dept_name in ('ACCOUNTING', 'RESEARCH') or location  = 'BOSTON'.
   // { "$or" : [ { "dept_name" : { "$in" : [ "ACCOUNTING" , "RESEARCH"]}} , {"location" : "BOSTON"}]}
   protected static DBObject getWhereClause_2() {
       List<String> list = new ArrayList<String>();
       list.add("ACCOUNTING");
       list.add("RESEARCH");
       //
       QueryBuilder qb1 = new QueryBuilder();
       qb1.put("dept_name").in(list);
       DBObject q1 = qb1.get();
       //
       QueryBuilder qb2 = new QueryBuilder();
       qb2.put("location").is("BOSTON");
       DBObject q2 = qb2.get();

       //
       QueryBuilder queryBuilder = QueryBuilder.start();
       queryBuilder.or(q1, q2);

       DBObject query = queryBuilder.get();
       return query;
   }

   // Cách 3 (Viết ngắn gọn cho cách 2):
   // Viết điều kiện where sử dụng QueryBuilder.
   // (Viết ngắn gọn)
   // Sử dụng QueryBuilder luôn luôn dễ dàng hơn.
   // dept_name in ('ACCOUNTING', 'RESEARCH') or location  = 'BOSTON'.
   // { "$or" : [ { "dept_name" : { "$in" : [ "ACCOUNTING" , "RESEARCH"]}} , {"location" : "BOSTON"}]}
   protected static DBObject getWhereClause_3() {
       List<String> list = new ArrayList<String>();
       list.add("ACCOUNTING");
       list.add("RESEARCH");
       //
       QueryBuilder queryBuilder = QueryBuilder.start();
       queryBuilder.or(QueryBuilder.start().put("dept_name").in(list).get(),
               QueryBuilder.start().put("location").is("BOSTON").get());

       DBObject query = queryBuilder.get();
       return query;
   }

   public static void main(String args[]) throws UnknownHostException {
       // To connect to mongodb server
       // Kết nối tới MongoDB.
       MongoClient mongoClient = MongoUtils.getMongoClient();
       // Now connect to your databases
       DB db = mongoClient.getDB(MyConstants.DB_NAME);
       DBCollection dept = db.getCollection("Department");

       DBObject query = getWhereClase_1();

       DBCursor cursor = dept.find(query);
       int i = 1;
       while (cursor.hasNext()) {
           System.out.println("Document: " + i);
           System.out.println(cursor.next());
           i++;
       }
       System.out.println("Done!");
   }
}
Kết quả chạy ví dụ:

10- Update Document

Trước hết chúng ta cần tạo một vài dữ liệu để test. Bạn cần chạy class CreateDataForUpdate dưới đây để có dữ liệu.
CreateDataForUpdate.java
package org.o7planning.tutorial.mongodb.update;

import java.net.UnknownHostException;

import org.o7planning.tutorial.mongodb.MongoUtils;
import org.o7planning.tutorial.mongodb.MyConstants;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.MongoClient;

public class CreateDataForUpdate {

  public static void main(String[] args) throws UnknownHostException {

      // To connect to mongodb server
      // Kết nối tới MongoDB.
      MongoClient mongoClient = MongoUtils.getMongoClient();

      // Now connect to your databases
      // Kết nối tới Database
      DB db = mongoClient.getDB(MyConstants.DB_NAME);

      // Lấy ra Collection với tên City.
      // Không nhất thiết Collection này phải tồn tại trong DB.
      DBCollection city = db.getCollection("City");

      String[] cityNos = new String[] { "CHI", "NYO", "WAS" };
      String[] cityNames = new String[] { "Chicago", "New York", "Washington" };
      int[] populations = new int[] { 3000000, 8000000, 1000000 };
      String[] descriptions = new String[] { "Pop 2013", null, "Pop 2013"};

      // Trèn một vài Document vào Collection City.
      for (int i = 0; i < 3; i++) {
          BasicDBObject doc = new BasicDBObject();
          doc.append("_id", i);
          doc.append("city_no", cityNos[i]);
          doc.append("city_name", cityNames[i]);
          doc.append("population", populations[i]);
          if (descriptions[i] != null) {
              doc.append("description", descriptions[i]);
          }
          city.insert(doc);
      }

      System.out.println("Done!");
  }

}
Kết quả chạy class trên, Collection City đã được tạo ra với 3 Document (Xem trên công cụ trực quan RoboMongo).

10.1- Ví dụ Update

UpdateDemo.java
package org.o7planning.tutorial.mongodb.update;

import java.net.UnknownHostException;

import org.o7planning.tutorial.mongodb.MongoUtils;
import org.o7planning.tutorial.mongodb.MyConstants;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.WriteResult;

public class UpdateDemo {

  public static void main(String[] args) throws UnknownHostException {

      // To connect to mongodb server
      // Kết nối tới MongoDB.
      MongoClient mongoClient = MongoUtils.getMongoClient();

      // Now connect to your databases
      // Kết nối tới Database
      DB db = mongoClient.getDB(MyConstants.DB_NAME);

      // Lấy ra Collection với tên City.
      DBCollection city = db.getCollection("City");

      // Tìm các City có city_no = "WAS".
      DBObject whereClause = new BasicDBObject("city_no", "WAS");

      DBObject values = new BasicDBObject();
      values.put("population", 1200000);
      values.put("description", "Pop 2014");
      values.put("note", "Document replaced!");

      // Thực hiện việc update.
      WriteResult result = city.update(whereClause, values);
      int effectedCount = result.getN();
      System.out.println("Effected Count: " + effectedCount);
      System.out.println("Done!");
  }

}
Kết quả chạy ví dụ và so sánh document trước và sau khi update:
Nhìn kết quả ở trên bạn nghĩ ngay rằng rõ ràng đây không phải là cách update bạn đang nghĩ, nó đúng hơn là thay thế (Replacement) thì đúng hơn.
Trong suy nghĩ của bạn nó phải là:

 
Bạn cần có thêm $set trong phần update. Hãy xem tiếp ví dụ tiếp theo.

10.2- Ví dụ Update với $set

UpdateWithSetDemo.java
package org.o7planning.tutorial.mongodb.update;

import java.net.UnknownHostException;

import org.o7planning.tutorial.mongodb.MongoUtils;
import org.o7planning.tutorial.mongodb.MyConstants;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.WriteResult;

public class UpdateWithSetDemo {

  public static void main(String[] args) throws UnknownHostException {


      // Kết nối tới MongoDB.
      MongoClient mongoClient = MongoUtils.getMongoClient();


      // Kết nối tới Database
      DB db = mongoClient.getDB(MyConstants.DB_NAME);

      // Lấy ra Collection với tên City.
      DBCollection city = db.getCollection("City");

      // Tìm các City có city_no = "CHI".
      DBObject whereClause = new BasicDBObject("city_no", "CHI");

      DBObject values = new BasicDBObject();
      values.put("population", 3400000);
      values.put("description", "Pop 2014");
      values.put("note", "Document update with $set");
     
      DBObject valuesWithSet = new BasicDBObject();
      valuesWithSet.put("$set", values);

      // Thực hiện việc update.
      WriteResult result = city.update(whereClause, valuesWithSet);
     
      int effectedCount = result.getN();
      System.out.println("Effected Count: " + effectedCount);
      System.out.println("Done!");
  }

}
Kết quả update:

10.3- Ví dụ Update với $inc

Sử dụng $inc trong trường hợp bạn muốn tăng giá trị cho một cột nào đó. Chẳng hạn tìm các City và update cột population (dân số) lên 10000.
UpdateWithIncDemo.java
package org.o7planning.tutorial.mongodb.update;

import java.net.UnknownHostException;

import org.o7planning.tutorial.mongodb.MongoUtils;
import org.o7planning.tutorial.mongodb.MyConstants;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.WriteResult;

public class UpdateWithIncDemo {

 public static void main(String[] args) throws UnknownHostException {

     // To connect to mongodb server
     // Kết nối tới MongoDB.
     MongoClient mongoClient = MongoUtils.getMongoClient();

     // Now connect to your databases
     // Kết nối tới Database
     DB db = mongoClient.getDB(MyConstants.DB_NAME);

     // Lấy ra Collection với tên City.
     DBCollection city = db.getCollection("City");

     // Tìm các City có city_no = "NYO".
     DBObject whereClause = new BasicDBObject("city_no", "NYO");

     DBObject values = new BasicDBObject();
     values.put("population", 10000);
   
   
     DBObject valuesWithInc = new BasicDBObject();
     valuesWithInc.put("$inc", values);

     // Thực hiện việc update.
     WriteResult result = city.update(whereClause, valuesWithInc);
   
     int effectedCount = result.getN();
     System.out.println("Effected Count: " + effectedCount);
     System.out.println("Done!");
 }

}
Kết quả Update:

10.4- Ví dụ Update với $set và $inc

Ví dụ:
DBObject values1 = new BasicDBObject();
values1.put("population", 10000);


DBObject values2 = new BasicDBObject();  
values2.put("description", "Pop 2014");


DBObject valuesSI = new BasicDBObject();
valuesSI.put("$inc", values1);
valuesSI.put("$set", values2);


WriteResult result = city.update(whereClause, valuesSI);

10.5- Update nhiều tài liệu (multi)

Sử dụng method:
// DBCollection class:

public WriteResult updateMulti( DBObject query , DBObject value )

11- Delete Document

  • TODO