11/08/2018, 23:36

Tìm hiểu MongoDB - phần 2

Tiếp tục tìm hiểu về MongoDB - một trong những công nghệ mới liên quan đến cơ sở dữ liệu mà các lập trình viên cần biết. Trong bài viết đầu tiên đã trình bày cơ bản về MongoDB: cách cài đặt, các thao tác cơ bản: thêm mới, sửa, xóa. Tiếp tục, bài thứ 2 này sẽ đi sâu hơn vào tìm kiếm logic và truy ...

Tiếp tục tìm hiểu về MongoDB - một trong những công nghệ mới liên quan đến cơ sở dữ liệu mà các lập trình viên cần biết. Trong bài viết đầu tiên đã trình bày cơ bản về MongoDB: cách cài đặt, các thao tác cơ bản: thêm mới, sửa, xóa. Tiếp tục, bài thứ 2 này sẽ đi sâu hơn vào tìm kiếm logic và truy vấn nâng cao.

Bài viết thứ hai này sẽ nói về 3 chủ đề chính sau:

  • Truy vấn nâng cao
  • Tìm kiếm logic
  • Regular Expression

Trước khi bắt đầu, chúng ta cùng xem trong cơ sở dữ liệu có tất cả bao nhiêu documents.

db.user.find();

Kết quả:

{ "_id" : ObjectId("55112f85fd296d29078b4567"), "name" : "Alex", "email" : "alex@gmail.com", "password" : "123456", "age" : "20", "gender" : "Male" }
{ "_id" : ObjectId("55112fa0fd296d2a078b4568"), "name" : "Smith", "email" : "smith@gmail.com", "password" : "nopass", "age" : "15", "gender" : "Female" }
{ "_id" : ObjectId("55112fe5fd296d2b078b4567"), "name" : "Oscar", "email" : "oscar@chelseafc.com", "password" : "oscar123", "age" : "24", "gender" : "Male" }
{ "_id" : ObjectId("55113045fd296d2c078b4567"), "name" : "Messi", "email" : "messi@barcelona", "password" : "adasjdajsd", "age" : "27", "gender" : "Male" }

Truy vấn nâng cao##

Biểu thức điều kiện nhằm mục đích giúp tìm kiếm collections trong cơ sở dữ liệu. Bài viết này sẽ tập trung vào 9 key sau:

  • $$t – giá trị phải nhỏ hơn điều kiện
  • $$t – giá trị phải lớn hơn điều kiện
  • $$te – giá trị phải nhỏ hơn hoặc bằng điều kiện
  • $$te – giá trị phải lớn hơn hoặc bằng điều kiện
  • $$n – giá trị phải nằm trong tập điều kiện
  • $$in – giá trị phải không nằm trong tập điều kiện
  • $$ot – giá trị không nắm trong điều kiện

lt/lt/lt/lte

Ví du để tìm tất cả user mà tuổi nhỏ hơn 20 chạy câu truy vấn sau:

db.user.find({age: {$lt: '20'}});

Sau khi chạy câu lệnh trên kết quả trả về như sau:

{ "_id" : ObjectId("55112fa0fd296d2a078b4568"), "name" : "Smith", "email" : "smith@gmail.com", "password" : "nopass", "age" : "15", "gender" : "Female" }

Nếu muốn cả những user 20 tuổi nằm trong kết quả trả về thì sử dụng truy vấn như sau:

db.user.find({age: {$lte: '20'}});

Kết quả:

{ "_id" : ObjectId("55112f85fd296d29078b4567"), "name" : "Alex", "email" : "alex@gmail.com", "password" : "123456", "age" : "20", "gender" : "Male" }
{ "_id" : ObjectId("55112fa0fd296d2a078b4568"), "name" : "Smith", "email" : "smith@gmail.com", "password" : "nopass", "age" : "15", "gender" : "Female" }

gt/gt/gt/gte

Tương tự nếu muốn lấy tất cả user mà lớn hơn 24 tuổi sử dụng truy vấn như sau:

db.user.find({age: {$gt: '24'}});

Kết quả trả về user 27 tuổi

{ "_id" : ObjectId("55113045fd296d2c078b4567"), "name" : "Messi", "email" : "messi@barcelona", "password" : "adasjdajsd", "age" : "27", "gender" : "Male" }

Nếu muốn lấy cả những user 24 tuổi thì sử dụng truy vấn $$te

db.user.find({age: {$gte: '24'}});

Kết quả:

{ "_id" : ObjectId("55112fe5fd296d2b078b4567"), "name" : "Oscar", "email" : "oscar@chelseafc.com", "password" : "oscar123", "age" : "24", "gender" : "Male" }
{ "_id" : ObjectId("55113045fd296d2c078b4567"), "name" : "Messi", "email" : "messi@barcelona", "password" : "adasjdajsd", "age" : "27", "gender" : "Male" }

in/in/in/nin

$$n giúp chúng ta tìm kiếm các documents nằm trong điều kiện cho trước. Ví dụ muốn lấy về các user có email nằm trong nhóm email sau: 'alex@gmail.com' và 'smith@gmail.com'

db.user.find({email: {'$in': ['alex@gmail.com', 'smith@gmail.com']}});

Kết quả

{ "_id" : ObjectId("55112f85fd296d29078b4567"), "name" : "Alex", "email" : "alex@gmail.com", "password" : "123456", "age" : "20", "gender" : "Male" }
{ "_id" : ObjectId("55112fa0fd296d2a078b4568"), "name" : "Smith", "email" : "smith@gmail.com", "password" : "nopass", "age" : "15", "gender" : "Female" }

Ngược lại nếu không muốn lấy những user sử dụng email đó chúng ta sử dụng $$in

db.user.find({email: {'$nin': ['alex@gmail.com', 'smith@gmail.com']}});

Kết quả:

{ "_id" : ObjectId("55112fe5fd296d2b078b4567"), "name" : "Oscar", "email" : "oscar@chelseafc.com", "password" : "oscar123", "age" : "24", "gender" : "Male" }
{ "_id" : ObjectId("55113045fd296d2c078b4567"), "name" : "Messi", "email" : "messi@barcelona", "password" : "adasjdajsd", "age" : "27", "gender" : "Male" }

Nếu muốn kết quả trả về dễ đọc hơn chỉ bao gồm name và age thì thêm vào truy vấn trên như sau:

db.user.find({email: {'$nin': ['alex@gmail.com', 'smith@gmail.com']}}, {'name': 1, 'age': 1});

Kết quả:

{ "_id" : ObjectId("55112fe5fd296d2b078b4567"), "name" : "Oscar", "age" : "24" }
{ "_id" : ObjectId("55113045fd296d2c078b4567"), "name" : "Messi", "age" : "27" }

Tìm kiếm theo điều kiện logic##

Trước khi đi vào tìm hiểu về tìm kiếm theo điều kiện là các biểu thức logic, chúng ta cùng tìm hiểu về Selectors. Selectors cung cấp cho chúng ta khả năng để có thể điều khiển nhiều hơn trong việc tìm các dữ liệu mà chúng tôi thực sự muốn, nó giúp bạn tìm kiếm một hoặc nhiều documents trong cơ sở dữ liệu theo một điều kiện nào đó. Selectors trong MongoDB tương tự như mềnh đề where trong SQL. Và cũng như mệnh đề WHERE, Mongo selectors cũng cho phép bạn làm được những điều sau:

  • $$nd: trả về documents phải thỏa mãn điều kiện
  • $$r: trả về documents thỏa mãn với 1 trong các điều kiện
  • $$ot: trả về documents phủ định với điều kiện đưa ra.
  • $$or: trả về documents không thỏa mãn với cả 2 điều kiện.

$$nd

Ví dụ: bạn muốn lấy ra tất cả user có giới tính là nam. Bạn có thể sử dụng câu lệnh sau:

db.user.find({$and: [{gender: 'Male'}, {email: 'alex@gmail.com'}]});

Kết quả:

{ "_id" : ObjectId("55112f85fd296d29078b4567"), "name" : "Alex", "email" : "alex@gmail.com", "password" : "123456", "age" : "20", "gender" : "Male" }

$$r

Ví dụ: bạn muốn lấy ra user là nữ hoặc trên 18 tuổi.

db.user.find({$or: [{gender: 'Female'}, {age: {$gt: 18}}]});

Kết qủa:

{ "_id" : ObjectId("55112fa0fd296d2a078b4568"), "name" : "Smith", "email" : "smith@gmail.com", "password" : "nopass", "age" : "15", "gender" : "Female" }

$$ot

Ví dụ: bạn muốn lấy ra các user lớn hơn 15 tuổi. Nghĩa là lấy các user nhỏ hơn hoặc bằng 15 tuổi.

db.user.find({age: {$not: {$gt: '15'}}});

Kết quả:

{ "_id" : ObjectId("55112fa0fd296d2a078b4568"), "name" : "Smith", "email" : "smith@gmail.com", "password" : "nopass", "age" : "15", "gender" : "Female" }

$$or

Ví dụ: bạn muốn lấy ra các user không phải nữ và không lớn hơn 15 tuổi.

db.user.find({$nor: [{gender: 'Female'}, {age: {$gt: '20'}}]});

Kết quả:

{ "_id" : ObjectId("55112f85fd296d29078b4567"), "name" : "Alex", "email" : "alex@gmail.com", "password" : "123456", "age" : "20", "gender" : "Male" }

Regular Expressions##

Regular Expressions là một chức năng nâng cao trong truy vấn dữ liệu. Ví dụ chúng ta muốn tìm những user mà có tên bắt đầu bởi chữ 'A' regular expression sẽ giúp chúng ta làm được điều này.

db.user.find({'name': /(A.*)/i});

Kết quả

{ "_id" : ObjectId("55112f85fd296d29078b4567"), "name" : "Alex", "email" : "alex@gmail.com", "password" : "123456", "age" : "20", "gender" : "Male" }
{ "_id" : ObjectId("55112fe5fd296d2b078b4567"), "name" : "Oscar", "email" : "oscar@chelseafc.com", "password" : "oscar123", "age" : "24", "gender" : "Male" }
'name': /(A.*)/i
  • //i chỉ định thực hiện regex case-insensitive
  • (A.*) chỉ định name phải bắt đầu bằng chữ A. Tương tự như query like 'A%' trong SQL.

Ngoài ra, có thể sử dụng $$egex để tìm như sau:

db.user.find({name: {$regex: 'A', $options: '$i'}});

Nếu không sử dụng regex case-insensitive. db.user.find({name: {$$egex: 'A'}});

{ "_id" : ObjectId("55112f85fd296d29078b4567"), "name" : "Alex", "email" : "alex@gmail.com", "password" : "123456", "age" : "20", "gender" : "Male"

Tóm lại, bài viết thứ 2 này đã giới thiệu về sâu hơn về các truy vấn bên cạnh 4 thao tác CRUD của bài lần trước. Các bạn có thể tham khảo source code tại đây

0