Sunday, January 25, 2015

Mongo DB – Một cơ sở dữ liệu NoSQL .

download
MongoDB được biết đến là một cơ sở dữ liệu không dùng mô hình dữ liệu quan hệ kiểu sql, là một sự khai triển từ NoSQL (not only SQL) cho việc lưu trữ dữ liệu document.Vậy NoSQL là gì? và MongoDB là gì?

I. Giới thiệu về NoSQL và Monggo DB

1. Khái quát về NoSQL

NoSQL : là một thế hệ cơ sở dữ liệu không ràng buộc, phân tán, mã nguồn mở, khả năng mở rộng theo chiều ngang, có thể lưu trữ, xử lý từ một lượng rất nhỏ cho tới hàng petabytes dữ liệu trong hệ thống có độ chịu tải, lỗi cao với những đòi hỏi về tài nguyên phần cứng thấp.

Đặc điểm:

- NoSQL lưu trữ dữ liệu của mình theo dạng cặp giá trị “key – value”. Sử dụng số lượng lớn các node để lưu trữ thông tin – Mô hình phân tán dưới sự kiểm soát phần mềm
- Chấp nhận dữ liệu bị trùng lặp do một số node sẽ lưu cùng thông tin giống nhau
- Một truy vấn sẽ được gửi tới nhiều máy cùng lúc, do đó khi một máy nào đó không phục vụ được sẽ không ảnh hưởng lắm đến chất lượng trả về kết quả
- Phi quan hệ – không có ràng buộc nào cho việc nhất quán dữ liệu
- Tính nhất quán không theo thời gian thực: Sau mỗi thay đổi CSDL, không cần tác động ngay đến tất cả các CSDL liên quan mà được lan truyền theo thời gian.

Các loại NoSQL :

- Key/values: Riak, Redis, Cassandra, Voldemort, Memcached
- Column-Family: HBase, HyperTable, Cassandra
- Document database: CouchDB, MongoDB
- Graph database: Neo4j,OrientDB, InfiniteGraph, AllegroGraph
Tuy cùng mang những đặc điểm chung nói trên của NoSQL nhưng một CSDL NoSQL cũng có những đặc điểm riêng, và vì thế thường được dùng cho những dự án khác nhau.

2. MongoDB

a. Khái niệm

MongoDB là một mã nguồn mở được viết bằng C++. Nó thích hợp cho các ứng dụng có tỉ lệ lượng dữ liệu ghi vào CSDL của ứng dụng lớn hơn lượng đọc.
- Support các OS: Windows, Linux, OS X, và Solaris.
- Hiện tại MongoDB hỗ trợ cho các ngôn ngữ dưới đây: C/C++, Java/ Javascript, .NET, Perl, PHP, Python, Ruby, Scala…vv

b. Đặc điểm.

- Document-oriented (tài liệu hướng đối tượng)
+ Documents (objects) hỗ trợ nhiều kiểu dữ liệu và có hầu hết trong các ngôn ngữ lập trình hiện tại
+ Embedded và mảng làm giảm nhu cầu kết (join) bảng
+ Schemaless (phần dưới)
+ Không phải kết (join) nên khả năng mở rộng dễ dàng
- High performance (hiệu suất cao)
+ Không kết (join) nên tốc độ đọc và ghi nhanh
+ Có thể đánh chỉ mục cho key, document hoặc array
- High availability (tính sẵn sàng cao)
+ Thực hiện xử lý trên nhiều máy chủ và có thể tự động chuyển đổi dự phòng
+ Easy scalability (dễ dàng mở rộng)
+ Tự động phân vùng dữ liệu trên các máy chủ
+ Đọc và viết được phân phối trên vùng dữ liệu
+ Không kết (join) làm cho các truy vấn dễ dàng và nhanh chóng
+ Có thể được phân phối trên các máy chủ khác nhau
- Rich query language (hỗ trợ truy vấn tốt)

3. Ưu nhược điểm của hệ cơ sở dữ liệu NoSQL.

a. Ưu điểm

- Chấp nhận sai sót (Fault Tolerant): dữ liệu của bạn đẽ được sao chép thành nhiều bản trên các server. Nếu chẳng may 1 server nào đó bị hỏng, bạn vẫn có thể truy xuất dữ liệu của bạn trên các server khác.

- Khả năng lưu trữ không giới hạn tùy thuộc vào ổ cứng nhưng vẫn đảm bảo high performance. Và ổ cứng hiện nay tăng về lượng nhưng giảm về giá thành.

- Tính co giãn (Elastic): khả năng đọc/ghi tăng tuyến tính theo số lượng máy được thêm vào cụm máy của bạn mà không có thời gian chết (downtime) hay sự gián đoạn ứng dụng đang chạy của bạn.

- Hướng cột (Column-Oriented) : các RDBMS hướng dòng (row-oriented) phải định nghĩa trước các cột (column) trong các bảng (table). Đối với MongoDB các bạn không phải làm điều đó, đơn giản là thêm vào bao nhiêu cột cũng được tùy theo nhu cầu của bạn.

b. Nhược điểm

- Thiếu hỗ trợ chuyên trách cho doanh nghiệp: do NoSQL là mã nguồn mở
- Hạn chế về nghiệp vụ: NoSQL hiện chưa hỗ trợ các dạng phân tích dữ liệu lớn và mạnh mẽ mà các doanh nghiệp đã quen thuộc trong các RDBMS.
- Thiếu chuyên gia: số lượng lập trình viên và quản trị hiểu biết về NoSQL hiện đang khá hạn chế cho nên khó khăn trong việc phát triển ứng dụng .
- Thiếu tính tương thích: các CSDL NoSQL khác nhau không tương thích với nhau, mỗi CSDL NoSQL có một giao diện và cung cấp API khác nhau và chưa có một tiêu chuẩn chung nào. Điều này có nghĩa là bạn sẽ gặp khó khăn trong việc chuyển từ nhà cung cấp này sang nhà cung cấp khác.

II. Tìm hiểu Monggo DB

1. Một số khái niệm

- Khóa (Key-value) là cặp từ khóa – giá trị được dùng để lưu trữ dữ liệu trong NoSQL
- Fields tương đương với khái niệm Columns trong CSDL quan hệ
- Index: chỉ mục là một cấu trúc dữ liệu, thu thập thông tin về giá trị của các fields trong document của một collection. Cấu trúc dữ liệu này được sử dụng trong tối ưu truy vấn Mongo để sắp xếp nhanh các document (văn bản) trong một collection(bộ sưu tập).

- Document là đơn vị cơ bản của dữ liệu trong MongoDB, nó tương đương với một dòng trong CSDL quan hệ. Đây cũng chính là khái niệm làm nên sự khác biệt giữa NoSQL và SQL, 1 document chứa số cột (fields) không cố định trong khi 1 row thì số cột (columns) là định sẵn trước.
Document bao gồm tập hợp key-value tương ứng.

- Bộ sưu tập(collection)
Dữ liệu trong MongoDB được lưu trữ tại Collection, mà lần lượt các Collection sẽ được lưu trữ trong cơ sở dữ liệu. Collection là một cách để thể hiển lưu trữ dữ liệu liên quan. Nếu văn bản tương đương với dòng trong CSDL quan hệ thì bộ sưu tập tương đương với bảng.

Bộ sưu tập là một Schema-Free, nghĩa là các văn bản có hình dạng khác nhau có thể cùng được lưu trữ trong 1 bộ sưu tập. Bộ sưu tập được xác định bởi tên của nó là một chuỗi UTF-8.

Dữ liệu được giới hạn khoảng 2GB trên hệ thống 32 bit, vì MongoDB sử dụng ánh xạ tập tin trong bộ nhớ khi chúng có sẵn một địa chỉ trong bộ nhớ. ( 1 file lưu trữ collection giới hạn 2GB). Mỗi document có một khóa đặc biệt ( _id ) nó là duy nhất trong collection .

Ví dụ:
{“greeting” : “Hello, world!”}
Văn bản trên gồm một khóa là “greeting”, với giá trị là “Hello, world!”. Các văn bản có thể chứa nhiều cặp khóa/giá trị như ví dụ sau:
{“greeting” : “Hello, world!”, “foo” : 3}
Một số lưu ý:
- Các cặp khóa/ giá trị trong văn bản được sắp xếp. Văn bản trên sẽ khác với văn bản sau
{“foo” : 3, “greeting” : “Hello, world!”}
- Khóa trong văn bản là một chuỗi
- MongoDB phân biệt chữ hoa chữ thường
- Văn bản trong MongoDB không được chứa những khóa giống nhau.
Xét văn bản không hợp lệ sau đây:
{“greeting” : “Hello, world!”, “greeting” : “Hello, MongoDB!”}
Các văn bản sau có thể cùng được lưu trong một bộ sưu tập:
{“greeting” : “Hello, world!”}
{“foo” : 5}
2. Các đặc trưng của MongoDB:

- Lưu trữ hướng văn bản: Văn bản theo phong cách JSON với những lược đồ động đơn giản
- Hỗ trợ chỉ mục đầy đủ: chỉ mục trên bất kì các thuộc tính.
- Tính sao lặp và tính sẵn sàng cao: mở rộng.
- Auto-sharding: mở rộng theo chiều ngang mà không ảnh hưởng đến chức năng
- Truy vấn: đa dạng, truy vấn dựa trên văn bản
- Cập nhật nhanh:
- Map/Reduce
- GridFS: lưu trữ file với bất kì kích cỡ nào mà không làm phức tạp ngăn xếp
- Hỗ trợ thương mại: hỗ trợ doanh nghiệp, đào tào, tư vấn

3. Cài đặt và cấu hình MongoDB trên Ubuntu

a. Cài đặt

- Sau khi thực hiện update các gói, ta Tải về gói tin sao cho phù hợp với cấu hình máy trên trang https://www.mongodb.org/downloads
-Giải nén và cài đặt
Gói download trong câu lệnh phía trên trong ví dụ là mongodb-linux-x86_64-2.2.2.tgz
Câu lệnh như sau:
tar -zxvf mongodb-linux-x86_64-2.2.2.tgz
mkdir -p /data/db
chown mongo /data/db
ln -s ./mongo/bin/* /usr/local/bin/
b. Cấu hình

Với các cài đặt từ repository dữ liệu sẽ được mặc định lưu vào /var/lib/mongodb và tệp tin cấu hình sẽ là /etc/mongodb.conf
Các bạn có thể tùy chỉnh một vài thông sốtrong tệp tin cấu hình như cổng (port mặc định là 27017), thư mục lưu trữ dữ liệu dbpath…
- Khởi động MongoDB:
service mongo start #(cài đặt bằng repository sẽ có các init_scripts
hoặc
./mongod –conf /etc/mongo.conf
- Chạy mongo shell
mongo
c. Một số thao tác cơ bản

- Tạo cơ sở dữ liệu mydb
use mydb
- Xem db hiện thời
db
- Tạo các đối tượng
thing={x:4,j=100}
- Insert đối tượng vào collection things
db.things.insert(thing) //db.things.save(thing)
for (var i = 1; i<=20; i++) db.thing.save(x:4,j:i)
- Query đối tượng
db.things.find()
- Làm việc với con trỏ
var c = db.things.find()
while ( c.hasNext() ) printjson( c.next() )
//gọi phần tử thứ 4
printjson( c [ 4 ] )
4. Một số câu lệnh trên MongoDB

help: in ra các thông tin giúp đỡ
show collections: Hiển thị các bộ sưu tập của database hiện thời
db.foo.find(): danh sách các đối tượng trong bộ sưu tập ‘foo’
db.foo.find(query): danh sách các đối tượng phù hợp với truy vấn trong bộ sưu tập ‘foo’
db.foo.update(query, update, upsert, multi): Nếu không có
db.foo.remove(query, justOne): Xóa tất cả hoặc 1 document thoả mãn với truy vấn
db.foo.drop(): xóa bộ sưu tập ‘foo’ từ database
it : lấy hết kết quả từ câu truy vấn
reset : cấu hình lại dữ liệu về trang thái ban đầu.

Các ví dụ.

Remove a field in array
db.UserPowerUp.find().forEach(function(doc) {
var arr = doc.user_power;
var length = arr.length;
for (var i = 0; i < length; i++) {
delete arr[i]["_id"];
}
db.UserPowerUp.save(doc);
});
Change type
// Đổi loại của ‘bad’ trong collection ‘foo’ từ integer sang String
db.foo.find().forEach( function (x) {
x.bad = new String(x.bad); // convert field to string
db.foo.save(x);
});
Set and Unset a field
for (var i = 1; i <= 446; i++) {
db.SexyLvCard.update({_id:i}, {$set: {‘sexyLvImgDescription’:”, descriptionAfterClear:”}})
};
for (var i = 1; i <= 446; i++) { db.SexyLvCard.update({_id:i}, {$unset: {‘specialAttack’:””}}) };
}
Trong đó: i từ 1->446
$set: update trường sexyLvImgDescription và descriptionAfterClear của bảng SexyLvCard là rỗng(hoặc null) của hàng có _id = i
$unset: không update specialAttack

5. Các biểu thức truy vấn trong mongo DB 

Câu lệnh tạo Conllection(tạo bảng)
db.createCollection ( “mycoll” )
Thêm một bản ghi(insert)
db.users.insert ({a: 3, b: 5})
Select lấy ra 1 số các trường
db.users.find ({}, {a: 1, b: 1}) Select * db.users.find ()
Select có điều kiện
db.users.find ({age: 33})
Select có sắp xếp
db.users.find({age:33}).sort({name:1})
Select với toán tử so sánh
ví dụ:
db.users.find ({name:{$gt:33}}) -> so sánh lớn hơn
db.users.find ({name:{$ne:33}}) -> so sánh không bằng
db.users.find ({name:Joe /}) -> so sánh gần đúng “%Joe%” (tên có chứa từ ‘Joe’ )
db.users.find({name:/^Joe/}) -> so sánh gần đúng “Joe%” (tên bắt đầu bằng ‘Joe’ )
db.users.find({‘age’:{$gt:33,$lte:40}}) so sánh > và <= db.users.find ({a: 1, b: ‘q’}) so sánh and: a=1 and b=‘q’
Select giới hạn số lượng bản ghi lấy ra
db.users.findOne () -> limit 1
Select các bản ghi không trùng lặp
db.users.distinct(‘last_name’)
Đếm số bản ghi
db.users.count() -> đếm tất cả các bản ghi
db.users.find({age: {‘$gt’: 30}}).count() -> chỉ đếm bản ghi nào có age>30
Tạo chỉ mục(Index)
db.users.ensureIndex({name:1}) -> tạo chỉ mục cho 1 trường
db.users.ensureIndex({name:1,ts:-1}) -> tạo chỉ mục 2 truòng
Lệnh Update
db.users.update({b:’q’}, {$set:{a:1}}, false, true)
db.users.update({b:’q’}, {$inc:{a:2}}, false, true)
Lệnh Delete
db.users.remove({z:’abc’});
Bảng dưới đây là các câu truy vấn của MongoDB tương ứng với các câu lệnh SQL:
SQL Statement
Mongo Statement
CREATE TABLE USERS (a Number, b Number) implicit; hoặc db.createCollection(“mycoll”)
ALTER TABLE users ADD … implicit


INSERT INTO USERS VALUES(3,5) db.users.insert({a:3,b:5})


SELECT a,b FROM users db.users.find({}, {a:1,b:1})
SELECT * FROM users db.users.find()
SELECT * FROM users WHERE age=33 db.users.find({age:33})
SELECT a,b FROM users WHERE age=33 db.users.find({age:33}, {a:1,b:1})
SELECT * FROM users WHERE age=33 ORDER BY name db.users.find({age:33}).sort({name:1})
SELECT * FROM users WHERE age>33 db.users.find({age:{$gt:33}})
SELECT * FROM users WHERE age!=33 db.users.find({age:{$ne:33}})
SELECT * FROM users WHERE name LIKE “%Joe%” db.users.find({name:/Joe/})
SELECT * FROM users WHERE name LIKE “Joe%” db.users.find({name:/^Joe/})
SELECT * FROM users WHERE age>33 AND age<=40 db.users.find({‘age’:{$gt:33,$lte:40}})
SELECT * FROM users ORDER BY name DESC db.users.find().sort({name:-1})
SELECT * FROM users WHERE a=1 and b=’q’ db.users.find({a:1,b:’q’})
SELECT * FROM users LIMIT 10 SKIP 20 db.users.find().limit(10).skip(20)
SELECT * FROM users WHERE a=1 or b=2 db.users.find( { $or : [ {a:1} , {b:2} ] } )
SELECT * FROM users LIMIT 1 db.users.findOne()
SELECT order_id FROM orders o, order_line_items li
WHERE li.order_id=o.order_id AND li.sku=12345
db.orders.find({“items.sku”:12345},{_id:1})
SELECT customer.name FROM customers,orders
WHERE orders.id = “q179″
AND orders.custid = customer.id
var o = db.orders.findOne({_id:”q179″});var name = db.customers.findOne({_id:o.custid})


SELECT DISTINCT last_name FROM users db.users.distinct(‘last_name’)
SELECT COUNT(*y)FROM users db.users.count()
SELECT COUNT(*y)FROM users where AGE > 30 db.users.find({age: {‘$gt’: 30}}).count()
SELECT COUNT(AGE) from users db.users.find({age: {‘$exists’: true}}).count()


CREATE INDEX myindexname ON users(name) db.users.ensureIndex({name:1})
CREATE INDEX myindexname ON users(name,ts DESC) db.users.ensureIndex({name:1,ts:-1})


EXPLAIN SELECT * FROM users WHERE z=3 db.users.find({z:3}).explain()


UPDATE users SET a=1 WHERE b=’q’ db.users.update({b:’q’},{$set:{a:1}},false,true)
UPDATE users SET a=a+2 WHERE b=’q’ db.users.update({b:’q’},{$inc:{a:2}},false,true)


DELETE FROM users WHERE z=”abc” db.users.remove({z:’abc’});

Tài liệu tham khảo:

http://docs.mongodb.org/manual/
http://www.mongodb.org/
http://www.tutorialspoint.com/mongodb/
http://kiemtailieu.com/cong-nghe-thong-tin/tai-lieu/nosql-mongodb/1.html


Nguồn : http://tech.blog.framgia.com/vn/?p=6769

No comments:

Post a Comment