Chuyển đến nội dung chính

Hướng dẫn MongoDB: Cách thiết lập và truy vấn cơ sở dữ liệu MongoDB

Tìm hiểu cách kết nối và phân tích cơ sở dữ liệu MongoDB trong Python.
Đã cập nhật 5 thg 10, 2026  · 10 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Có lẽ bạn đã từng nghe nói về cơ sở dữ liệu quan hệ, thậm chí là đã làm việc với chúng. Định dạng hàng-bảng là cấu trúc phổ biến và trực quan nhất để lưu trữ thông tin. Đáng tiếc là bạn không thể đưa mọi loại dữ liệu vào hàng và bảng. Thực tế, rất nhiều bài toán trong đời sống cần đến các cơ sở dữ liệu phi quan hệ. Vậy có lựa chọn thay thế không?

Câu trả lời là CÓ! Có bốn loại cơ sở dữ liệu không dùng hàng hoặc bảng. Chúng được gọi là cơ sở dữ liệu NoSQL vì bạn không thể dùng SQL để truy vấn. Bao gồm:

  • Cơ sở dữ liệu khóa-giá trị (key-value)
  • Cơ sở dữ liệu tài liệu (document)
  • Cơ sở dữ liệu họ cột (column family)
  • Cơ sở dữ liệu đồ thị (graph)

Bài viết này tập trung vào cơ sở dữ liệu tài liệu và cách dùng một máy chủ có tên MongoDB. Nhưng trước khi đi vào chi tiết kỹ thuật, hãy xem các trường hợp sử dụng của cơ sở dữ liệu tài liệu. Bạn có thể xem hướng dẫn riêng về cơ sở dữ liệu đồ thị để biết thêm thông tin.

Khi nào nên dùng cơ sở dữ liệu tài liệu?

Một trong những trường hợp chính để chọn cơ sở dữ liệu tài liệu là khi dữ liệu của bạn không vừa vặn với một lược đồ (schema) định sẵn như bảng. Nhiều quy trình hay ứng dụng trong các ngành lưu trữ kiểu dữ liệu như vậy. Ví dụ:

  • Ứng dụng web và di động: Hồ sơ người dùng, tùy chọn, nội dung và tương tác
  • Hệ thống quản lý nội dung: Lưu trữ đa dạng loại media như văn bản, ảnh, video, GIF, v.v.
  • Nền tảng thương mại điện tử: Danh mục sản phẩm, thông tin khách hàng, lịch sử đơn hàng, tồn kho, v.v.
  • Trò chơi: lưu hồ sơ người chơi, xếp hạng bảng dẫn
  • Ghi log và thu thập dữ liệu: khối lượng lớn log, sự kiện, chỉ số phục vụ phân tích, v.v.

Hãy thử nghĩ xem dữ liệu thu thập từ các ngành này sẽ nhét vào bảng như thế nào. Chẳng hạn, nền tảng thương mại điện tử sẽ gặp khó khi đưa danh mục sản phẩm vào một lược đồ định sẵn. Sản phẩm khác nhau có thuộc tính khác nhau hoặc tệ hơn là số lượng thuộc tính khác nhau. Bạn cần 10 cột để lưu 10 thuộc tính vật lý của drone từ 100 hãng khác nhau hay chỉ 5–6 cột để lưu thông tin sách?

Cơ sở dữ liệu dạng bảng không giúp được bạn trong những tình huống như vậy. Bằng cách dùng cơ sở dữ liệu tài liệu như MongoDB, bạn nhận được các lợi ích sau:

  • Không tốn chi phí phát triển ban đầu để thiết kế lược đồ
  • Tài liệu (dữ liệu) có thể thay đổi theo thời gian (bao gồm kiểu dữ liệu, số lượng thuộc tính, v.v.)
  • Cơ sở dữ liệu tài liệu tránh dùng join, nhờ đó truy vấn nhanh hơn nhiều
  • Trực quan với lập trình viên vì cơ sở dữ liệu tài liệu chủ yếu là các tệp JSON lớn, về cơ bản là những “từ điển khổng lồ” với người dùng Python.
  • Các DB tài liệu mở rộng theo chiều ngang, tức không cần tăng tài nguyên tính toán tương ứng khi cơ sở dữ liệu lớn dần.

Giờ hãy cùng xem các khái niệm cốt lõi xoay quanh cơ sở dữ liệu tài liệu và MongoDB.

Các khái niệm cốt lõi về MongoDB

Từ nãy đến giờ tôi liên tục nhắc đến cơ sở dữ liệu tài liệu, nhưng chính xác chúng là gì? Dưới đây là các khái niệm chính:

  • Tài liệu (Document): dữ liệu được lưu trong các đối tượng gọi là tài liệu. Nói đơn giản, tài liệu giống các đối tượng khóa-giá trị JSON. Một tài liệu tương đương một hàng trong bảng. Nếu bạn là lập trình viên Python, cứ xem tài liệu như một dictionary là ổn. Chỉ cần nhớ tài liệu có thể lồng tài liệu bên trong, đây là một đặc trưng quan trọng của cơ sở dữ liệu tài liệu.
  • Bộ sưu tập (Collection): collections giống như bảng trong cơ sở dữ liệu quan hệ, nhưng thay vì chứa hàng, chúng chứa — bạn đoán đúng rồi — tài liệu. Collection là các cấu trúc dữ liệu khổng lồ có thể chứa hàng nghìn đến hàng triệu dictionary.
  • Không lược đồ (Schema-less): Đây là điểm thú vị. Một collection có thể chứa các tài liệu với kích thước khác nhau. Ví dụ, tài liệu 1 có 10 cặp khóa-giá trị trong khi tài liệu 2 có 15 (miễn là thông tin cùng danh mục/chủ đề, như sản phẩm, để collection có ý nghĩa).

Dưới đây là một bảng tóm tắt rất hay về khác biệt giữa cơ sở dữ liệu quan hệ và cơ sở dữ liệu tài liệu:

Tính năng Cơ sở dữ liệu tài liệu (vd., MongoDB) Cơ sở dữ liệu quan hệ (vd., MySQL, PostgreSQL)
Cấu trúc dữ liệu Lưu dữ liệu dạng tài liệu (vd., JSON, BSON), cho phép cấu trúc linh hoạt, phân cấp. Lưu dữ liệu trong bảng với hàng và cột, theo lược đồ định sẵn.
Tính linh hoạt của lược đồ Không lược đồ: Tài liệu có thể có cấu trúc khác nhau, cho phép các trường và kiểu dữ liệu khác nhau. Lược đồ cố định: Yêu cầu lược đồ định sẵn với cột và kiểu dữ liệu cụ thể.
Ngôn ngữ truy vấn Dùng MongoDB Query Language (MQL) hoặc tương tự, dựa trên đối tượng và linh hoạt hơn. Dùng SQL (Structured Query Language) để truy vấn dữ liệu có cấu trúc.
Joins Tránh dùng join bằng cách nhúng dữ liệu liên quan bên trong tài liệu (phi chuẩn hóa). Hỗ trợ join phức tạp giữa các bảng (chuẩn hóa).
Hiệu năng Đọc/ghi nhanh hơn cho dữ liệu phi cấu trúc hoặc bán cấu trúc. Tránh chi phí do join gây ra. Hiệu năng mạnh cho dữ liệu có cấu trúc, nhưng join có thể làm chậm truy vấn.
Khả năng mở rộng Mở rộng ngang: Có thể phân phối dữ liệu qua nhiều máy chủ bằng sharding. Thường mở rộng dọc: Dựa vào phần cứng mạnh hơn, dù một số hỗ trợ mở rộng ngang (vd., phân vùng).
Hỗ trợ giao dịch Hỗ trợ giao dịch ACID đa tài liệu (từ MongoDB 4.0 trở lên), nhưng ban đầu được thiết kế cho thao tác không giao dịch. Hỗ trợ đầy đủ giao dịch tuân thủ ACID, đảm bảo tính nhất quán và độ tin cậy cao.
Trường hợp sử dụng Tối ưu cho dữ liệu phi cấu trúc/bán cấu trúc như hồ sơ người dùng, log, danh mục và cấu trúc dữ liệu linh hoạt. Lý tưởng cho dữ liệu có cấu trúc với mối quan hệ rõ ràng, như hồ sơ tài chính hoặc ERP.
Mối quan hệ dữ liệu Hỗ trợ dữ liệu nhúng (phi chuẩn hóa), giúp dễ dàng truy xuất thông tin liên quan bằng một truy vấn. Dựa vào khóa ngoại để thiết lập quan hệ giữa các bảng (chuẩn hóa).
Đánh chỉ mục Hỗ trợ đánh chỉ mục nhưng thiếu sự đa dạng và tinh vi như trong cơ sở dữ liệu quan hệ. Khả năng đánh chỉ mục mạnh, hỗ trợ nhiều loại chỉ mục (vd., B-tree, hash) để tối ưu hiệu năng.
Tính nhất quán Cung cấp tính nhất quán cuối cùng trong môi trường phân tán nhưng cũng có thể đảm bảo nhất quán mạnh khi cần (qua giao dịch ACID). Đảm bảo tính nhất quán mạnh trong hầu hết trường hợp nhờ giao dịch ACID và toàn vẹn quan hệ.
Mở rộng khối lượng dữ liệu Dễ dàng mở rộng để đáp ứng dữ liệu lớn bằng cách thêm máy chủ (sharding). Có thể mở rộng dọc, nhưng mở rộng ngang cần cấu hình phức tạp hơn (vd., phân vùng).
Tính toàn vẹn dữ liệu Tính toàn vẹn được quản lý trong từng tài liệu, nhưng quản lý quan hệ giữa tài liệu có thể thách thức hơn. Hỗ trợ mạnh mẽ tính toàn vẹn dữ liệu qua khóa chính/ngoại và các ràng buộc như UNIQUE, NOT NULL.
Thân thiện với nhà phát triển Thân thiện với dev: Mô hình dữ liệu linh hoạt, hoạt động tốt với ứng dụng hiện đại (vd., JSON, REST APIs). Mô hình dữ liệu cứng nhắc hơn nhưng quen thuộc với dev biết SQL và dữ liệu có cấu trúc.

Hãy bắt tay làm việc với tài liệu trong MongoDB!

Thiết lập MongoDB: Kết nối tới nguồn dữ liệu

Để truy vấn cơ sở dữ liệu tài liệu, ta cần cài đặt máy chủ MongoDB. Dưới đây là hướng dẫn theo nền tảng:

  • Với Windows, làm theo hướng dẫn tại liên kết này.
  • Với hệ thống giống Unix, bạn có thể cài MongoDB từ terminal:
$ sudo apt-get install -y mongodb

Sau đó, trong môi trường ảo, cài các thư viện pymongo và requests. pymongo là adapter Python chính thức cho máy chủ MongoDB. Ta sẽ cần thư viện requests để lấy dữ liệu từ một API.

$ pip install pymongo
$ pip install requests

Tiếp theo, từ terminal, khởi động máy chủ MongoDB với lệnh sau:

$ sudo service mongodb start

Giờ ta đã sẵn sàng nạp dữ liệu vào cơ sở dữ liệu tài liệu. Có hai kịch bản:

  1. Bạn có dữ liệu cục bộ ở định dạng phù hợp như JSON, BSON, YAML hoặc XML.
  2. Bạn cần lấy dữ liệu từ nguồn bên ngoài, thường là API.

Chúng ta sẽ làm cả hai. Trước hết, hãy nạp một collection tên drone_races.json cục bộ. Đoạn mã như sau:

import json

from pymongo import MongoClient

# Establish connection to MongoDB
client = MongoClient("localhost", 27017)
# Create a database named "drones"
drones = client["drones"]
# Create a collection named "races"
races = drones["races"]

# Load dataset into MongoDB
with open("data/drone_races.json", "r") as file:
   data = json.load(file)
   races.insert_many(data)

Hai đối tượng quan trọng nhất với chúng ta là drones (một cơ sở dữ liệu) và races (một collection). Phần lớn hàm/phương thức sẽ liên quan đến collection. Đối tượng cơ sở dữ liệu chủ yếu dùng để quản lý các collection.

Giờ hãy xem cách nạp cùng dữ liệu đó qua API. Tôi đã lưu thông tin dưới dạng API bằng dịch vụ Mockaroo. Đoạn mã đây:

import requests
from pymongo import MongoClient

# Fetch data from the API
api_url = (
   "https://my.api.mockaroo.com/drone_race_matches.json?key=6f5a6b50"
)
response = requests.get(api_url)

if response.status_code == 200:
   data = response.json()  # Get the JSON data from the API

   # Establish a connection to MongoDB
   client = MongoClient()

   # Access or create a specific database
   drones = client["drones"]

   # Access or create a specific collection within the database
   races = drones["races"]

   # Insert the fetched data into the MongoDB collection
   races.insert_many(data)
else:
   print("Failed to fetch data from the API.")

Chúng ta đã nạp một số dữ liệu vào collection races của cơ sở dữ liệu tài liệu drones, hay chưa? Hãy kiểm tra bằng các truy vấn!

Các truy vấn MongoDB cơ bản

Đếm tài liệu trong MongoDB

Ta cần đếm số tài liệu bên trong để biết collection có dữ liệu không. Ta sẽ dùng phương thức count_documents để làm điều đó:

>>> races.count_documents({})
9040

Lưu ý dictionary rỗng được truyền vào count_documents. Dictionary đó được gọi là bộ lọc (filter) trong MongoDB. Khi đi tiếp trong bài, ta sẽ học cách điền dictionary để tạo các bộ lọc khác nhau. Hiện tại, ta chưa có bộ lọc. Mã trên tương tự SELECT COUNT(*) FROM table_name trong SQL.

Chúng ta có 9040 tài liệu — tuyệt! Giờ hãy xem một ít dữ liệu.

Trích xuất một tài liệu trong MongoDB

Để xem một tài liệu với pymongo, ta có thể dùng phương thức find_one:

from pprint import pprint

>>> pprint(races.find_one())
{'_id': ObjectId('659d31e9255ec0cf4bab529d'),
'laps': 3,
'league': 'F1 Drones',
'location': {'city': 'Ford',
             'country': 'United Kingdom',
             'date': 'error: invalid date "2024-10-25"',
             'venue': 'Manhattan Seas'},
'name': 'Honorable',
'pilots': {'drone': 'DJI3-old',
           'finishing_position': 66,
           'name': 'Kariotta Cow',
           'qualification_time': 27.39,
           'team': 'Sky Crusaders',
           'telemetry': {'altitude': 34.3,
                         'battery_voltage': 12.1,
                         'speed': 68.3,
                         'timestamp': 'error: invalid date '
                                      '"2024-10-25T14:09:26Z"'}},
'sponsors': ['Fat Shark', 'DJI', 'Etisalat'],
'weather_conditions': 'snowy'}

Hãy để ý các trường (key) của tài liệu này. Nó lưu thông tin về một cuộc đua drone và bao gồm các thông tin như:

  • Số vòng đua
  • Điều kiện thời tiết lúc diễn ra trận
  • Các phi công (không phải tất cả) trong trận
  • Nhà tài trợ của trận, v.v.

Tài liệu cũng có trường bắt buộc _id, là một hash duy nhất.

Chọn tất cả tài liệu trong MongoDB

count_documents luôn trả về một con số, nhưng đôi khi, ta muốn xem dữ liệu mà truy vấn khớp. Để làm vậy, ta có thể dùng “anh cả” của find_one, đó là find:

from pprint import pprint

for race in races.find():
   pprint(race)
   break

{'_id': ObjectId('659d31e9255ec0cf4bab529d'),
'laps': 3,
'league': 'F1 Drones',
'location': {'city': 'Ford',
             'country': 'United Kingdom',
             'date': 'error: invalid date "2024-10-25"',
             'venue': 'Manhattan Seas'},
'name': 'Honorable',
'pilots': {'drone': 'DJI3-old',
           'finishing_position': 66,
           'name': 'Kariotta Cow',
           'qualification_time': 27.39,
           'team': 'Sky Crusaders',
           'telemetry': {'altitude': 34.3,
                         'battery_voltage': 12.1,
                         'speed': 68.3,
                         'timestamp': 'error: invalid date '
                                      '"2024-10-25T14:09:26Z"'}},
'sponsors': ['Fat Shark', 'DJI', 'Etisalat'],
'weather_conditions': 'snowy'}

find với truy vấn rỗng (không tham số) trả về các tài liệu lần lượt, nhưng đó không phải điều ta muốn! Ta muốn thực hiện truy vấn để trả lời những câu hỏi thú vị về dữ liệu. Đây là lúc các tài liệu bộ lọc phát huy tác dụng.

Chọn theo điều kiện trong MongoDB

Hãy bắt đầu với các bộ lọc đơn giản nhất — tìm các tài liệu có trường bằng một giá trị nào đó. Điều này tương đương:

SELECT *
 FROM table_name
WHERE field = value

Hãy làm điều đó trong MongoDB:

criteria = {"sponsors": "Fat Shark"}

fat_shark_races = races.count_documents(criteria)
fat_shark_races

6194

Ở trên, ta chọn các trận có "Fat Shark" là nhà tài trợ. Cú pháp chỉ đơn giản là một dictionary ánh xạ trường sponsors tới "Fat Shark".

Ngôn ngữ truy vấn MongoDB sẽ không đúng nghĩa “ngôn ngữ” nếu thiếu các toán tử so sánh. Đây là cách dùng toán tử “nhỏ hơn”:

criteria = {"pilots.qualification_time": {"$lt": 10}}

quick_races = races.count_documents(criteria)
quick_races

3061

Truy vấn trên giới thiệu bốn đặc điểm mới của ngôn ngữ truy vấn MongoDB (MQL):

  • Bạn có thể truy cập trường con với cú pháp dấu chấm. pilots.qualification_time trích xuất thời gian vòng loại được lồng trong trường pilots.
  • Hầu hết toán tử trong MQL bắt đầu bằng ký hiệu dollar.
  • Các toán tử được dùng trong một tài liệu lồng như trên.
  • $lt là toán tử “nhỏ hơn”.

Vậy kết quả truy vấn này cho biết có 3061 trận mà một phi công có thời gian vòng loại dưới 10 giây. Truy vấn này khả thi nhờ toán tử $lt. Dưới đây là “anh chị em” của nó:

  • $lte: nhỏ hơn hoặc bằng
  • $gt: lớn hơn
  • $gte: lớn hơn hoặc bằng.

Chúng có cùng cú pháp với $lt.

Chọn với các toán tử logic trong MongoDB

MQL cũng có các toán tử logic như $and và $or. Hãy bắt đầu với toán tử thứ hai.

Chúng ta sẽ truy xuất các trận có địa điểm là Vương quốc Anh hoặc nhà tài trợ là Etisalat:

criteria = {
   "$or": [
       {"location.country": "United Kingdom"},
       {"sponsors": "Etisalat"},
   ]
}

>>> races.count_documents(criteria)

6223

Một lần nữa, dùng nút Explain code để xem giải thích chi tiết.

Có 6223 tài liệu khớp tiêu chí. Để dùng logic OR cho nhiều giá trị của cùng một trường, ta có thể dùng toán tử $in.

Ví dụ, ta có thể kiểm tra điều kiện thời tiết xấu như sau:

criteria = {
   "weather_conditions": {"$in": ["rainy", "snowy", "cloudy"]}
}

>>> races.count_documents(criteria)

5508

Truy vấn này sẽ rất phiền nếu viết bằng toán tử $or. Giờ đến $and.

Lần này, ta muốn tìm các trận có địa điểm là Australia VÀ nhà tài trợ là Fat Shark. Đây là cách làm với $and:

criteria = {
   "$and": [
       {"location.country": "Australia"},
       {"sponsors": "Fat Shark"},
   ]
}
>>> races.count_documents(criteria)
193

Nhưng thực tế, bạn sẽ hiếm khi dùng $and vì có thể triển khai đơn giản hơn nhiều:

criteria = {
   "location.country": "Australia",
   "sponsors": "Fat Shark",
}

races.count_documents(criteria)
193

Chỉ cần thêm nhiều cặp khóa-giá trị vào tài liệu bộ lọc là đạt logic AND.

Cuối cùng là toán tử $nin, dùng để kiểm tra không thuộc tập. Ví dụ, ta có thể trả về tất cả các trận không diễn ra ở Hoa Kỳ, Vương quốc Anh hoặc Australia:

criteria = {
   "location.country": {
       "$nin": ["United States", "United Kingdom", "Australia"]
   }
}

>>> races.count_documents(criteria)
126

Điều này chỉ còn lại Các Tiểu vương quốc Ả Rập Thống nhất là quốc gia, vì thế truy vấn trên thực ra có thể viết là:

criteria = {"location.country": "United Arab Emirates"}

>>> races.count_documents(criteria)
126

Nhưng bạn đã hiểu ý tưởng.

Truy vấn giá trị null hoặc thiếu trong MongoDB

Kiểm tra giá trị null hoặc thiếu là thao tác phổ quát trong mọi tác vụ phân tích dữ liệu. Do đó, MongoDB có toán tử dành cho việc này — $exists. Dưới đây là hai ví dụ kiểm tra một trường có tồn tại hay không:

criteria = {"location.district": {"$exists": True}}

>>> races.count_documents(criteria)

0

Hmm, hóa ra district Trường laps không tồn tại trong bất kỳ tài liệu nào. Tuy nhiên, nó phải tồn tại trong mọi tài liệu vì là thông tin then chốt về các trận đua.

criteria = {"laps": {"$exists": True}}

races.count_documents(criteria)
9040

Đúng như kỳ vọng, tất cả tài liệu đều có trường laps. Nhưng còn các trường tồn tại nhưng có giá trị null thì sao? Ta cũng có thể kiểm tra:

criteria = {"pilots.finishing_position": None}

races.count_documents(criteria)
0

Bằng cách dùng đối tượng dựng sẵn None trong Python, ta có thể kiểm tra tính thiếu vắng của giá trị ở bất kỳ trường nào.

Cũng có những tình huống nâng cao cần kiểm tra null hoặc sự tồn tại. Ví dụ, bạn có thể muốn kiểm tra một số phần tử của các mảng lồng khổng lồ có tồn tại không.

Để làm điều này, ta có thể dùng cú pháp đánh chỉ số mảng trong MQL. Chẳng hạn, để tìm các trận chỉ có một nhà tài trợ, ta cần kiểm tra phần tử thứ hai của mảng sponsors có tồn tại không:

# Đếm bắt đầu từ 0 như thường lệ
criteria = {"sponsors.1": {"$exists": False}}

races.count_documents(criteria)
2929

Và nó đơn giản như thêm số chỉ mục của phần tử vào khóa. Vậy là trong collection của chúng ta, gần 3000 trận chỉ có một đơn vị tài trợ.

Cú pháp đánh chỉ số mảng này dùng được với nhiều toán tử khác, không chỉ $exists.

Projection (giới hạn trường)

Điều cuối cùng chúng ta sẽ đề cập trong hướng dẫn là projection. Từ đầu đến giờ, kết quả truy vấn của ta bao gồm mọi trường trong mỗi tài liệu. Điều này không lý tưởng khi tài liệu có hàng trăm trường. Hãy tưởng tượng những đầu ra rối mắt khi bạn in chúng!

Vì vậy, để chọn các trường muốn trả về, ta có thể dùng projection. Cách làm như sau:

criteria = {"pilots.telemetry.speed": {"$gte": 20}}
projection = {
   "sponsors": 1,
   "location.country": 1,
   "pilots.telemetry.speed": 1,
   "pilots.name": 1,
}

fast_pilots = races.find(criteria, projection)

for pilot in fast_pilots:
   pprint(pilot)
   break

Trong trường hợp trên, ta viết tiêu chí lọc như thường lệ nhưng lần này, ta định nghĩa thêm một tài liệu với bốn trường đặt thành 1. Nếu truyền tài liệu projection này làm tham số thứ hai cho find hoặc count_documents, ta sẽ chỉ nhận các trường đặt 1 trong đầu ra.

{'_id': ObjectId('659d31e9255ec0cf4bab529d'),
'location': {'country': 'United Kingdom'},
'pilots': {'name': 'Kariotta Cow', 'telemetry': {'speed': 68.3}},
'sponsors': ['Fat Shark', 'DJI', 'Etisalat']}

Mặc dù ta chỉ chọn bốn trường, trường _id “cứng đầu” vẫn len vào bằng cách nào đó. Để loại bỏ hành vi này, đặt nó thành 0 trong dictionary projection:

criteria = {"pilots.telemetry.speed": {"$gte": 20}}
projection = {
   "sponsors": 1,
   "location.country": 1,
   "pilots.telemetry.speed": 1,
   "pilots.name": 1,
   "_id": 0,
}

fast_pilots = races.find(criteria, projection)

for pilot in fast_pilots:
   pprint(pilot)
   break

{'location': {'country': 'United Kingdom'},
'pilots': {'name': 'Kariotta Cow', 'telemetry': {'speed': 68.3}},
'sponsors': ['Fat Shark', 'DJI', 'Etisalat']}

Giờ thì “đẹp” hơn rồi.

Cuối cùng, để trả về tất cả trừ một vài trường, ta đặt các trường đó thành 0:

projection = {"_id": 0, "league": 0, "pilots": 0}

# Tiêu chí rỗng cho ví dụ này
races.find_one({}, projection)

{'name': 'Honorable',
'location': {'venue': 'Manhattan Seas',
 'city': 'Ford',
 'country': 'United Kingdom',
 'date': 'error: invalid date "2024-10-25"'},
'sponsors': ['Fat Shark', 'DJI', 'Etisalat'],
'laps': 3,
'weather_conditions': 'snowy'}

Như bạn thấy, lần này ta có tất cả các trường trừ _id, league và pilots.

Kết luận

Hướng dẫn này chưa lột tả hết quy mô đồ sộ của MongoDB với tư cách công cụ quản trị cơ sở dữ liệu. Hôm nay, chúng ta chỉ đề cập đến truy vấn GET (truy vấn lấy thông tin), nhưng MongoDB cũng cho phép chuyên gia dữ liệu chèn, cập nhật hoặc xóa thông tin trong cơ sở dữ liệu tài liệu. Chúng ta cũng bỏ qua cả một lớp truy vấn — tổng hợp (aggregation).

Tất cả các chủ đề này nằm ngoài phạm vi bài viết và cần tài nguyên bổ sung để học. Sao bạn không xem thử những nội dung sau:

Câu hỏi thường gặp

Cơ sở dữ liệu tài liệu như MongoDB khác gì so với cơ sở dữ liệu quan hệ?

Cơ sở dữ liệu tài liệu, như MongoDB, lưu dữ liệu trong các tài liệu (thường ở định dạng giống JSON), có thể chứa cấu trúc dữ liệu lồng nhau. Điều này khác với cơ sở dữ liệu quan hệ, nơi dữ liệu được lưu theo hàng và bảng với lược đồ cố định. Cơ sở dữ liệu tài liệu cho phép linh hoạt hơn vì lược đồ là động, nghĩa là mỗi tài liệu có thể có các trường và kiểu dữ liệu khác nhau. Điều này khiến MongoDB phù hợp cho dữ liệu phi cấu trúc hoặc bán cấu trúc, trái ngược với cơ sở dữ liệu quan hệ, vốn yêu cầu lược đồ định sẵn.

Vì sao tôi nên dùng MongoDB thay vì cơ sở dữ liệu quan hệ?

MongoDB hữu ích khi làm việc với dữ liệu không phù hợp gọn gàng với cấu trúc dạng bảng. Hãy dùng MongoDB nếu dữ liệu của bạn có lược đồ linh hoạt, nếu bạn dự đoán cấu trúc dữ liệu sẽ thường xuyên thay đổi, hoặc nếu bạn cần xử lý khối lượng lớn dữ liệu phi cấu trúc. Đây cũng là lựa chọn tốt cho các ứng dụng cần tốc độ đọc/ghi cao ở quy mô lớn, như thương mại điện tử, ghi log và hệ thống quản lý nội dung.

Những ngôn ngữ lập trình nào tương thích với MongoDB?

MongoDB tương thích với nhiều ngôn ngữ lập trình, bao gồm Python, Java, JavaScript, Node.js, Go, Ruby và C#, thông qua các driver và thư viện chính thức. Thư viện Python pymongo thường được dùng để tương tác với MongoDB trong các ứng dụng khoa học dữ liệu. MongoDB cũng tích hợp tốt với các framework hiện đại như Django, Flask và Express.js.

MongoDB xử lý dữ liệu quy mô lớn và mở rộng ngang như thế nào?

MongoDB được thiết kế để mở rộng ngang thông qua sharding, trong đó dữ liệu được phân phối qua nhiều máy chủ để quản lý dữ liệu quy mô lớn hiệu quả. Khi dữ liệu tăng, MongoDB có thể phân tán tải qua nhiều máy, giúp cải thiện hiệu năng và dung lượng. Điều này khiến MongoDB lý tưởng cho các ứng dụng dữ liệu lớn hoặc những ứng dụng tăng trưởng nhanh về khối lượng dữ liệu.

MongoDB có xử lý được các truy vấn phức tạp như cơ sở dữ liệu SQL không?

MongoDB có thể xử lý truy vấn phức tạp, nhưng ngôn ngữ truy vấn của nó (MQL, MongoDB Query Language) khá khác với SQL. MongoDB hỗ trợ bộ lọc, projection, toán tử logic và aggregation để thực hiện các truy vấn tinh vi, cho phép bạn truy xuất, lọc và biến đổi dữ liệu. Tuy nhiên, khác với cơ sở dữ liệu SQL, MongoDB không hỗ trợ join theo cách tương tự, vì nó được thiết kế để phi chuẩn hóa dữ liệu vào các cấu trúc tài liệu linh hoạt.

MongoDB có phù hợp cho phân tích thời gian thực không?

MongoDB có thể dùng cho phân tích thời gian thực, nhưng hiệu năng phụ thuộc nhiều vào cách cấu trúc và đánh chỉ mục dữ liệu. Nhờ hệ thống đánh chỉ mục mạnh và khung aggregation, bạn có thể chạy truy vấn thời gian thực và tạo insight hiệu quả. Tuy nhiên, với các tác vụ phân tích phức tạp hơn, bạn có thể tích hợp MongoDB với các công cụ như Apache Spark hoặc dùng aggregation framework để xử lý thời gian thực ở quy mô lớn.

MongoDB có những tính năng bảo mật nào?

MongoDB cung cấp nhiều tính năng bảo mật, bao gồm xác thực, phân quyền (kiểm soát truy cập dựa trên vai trò), mã hóa (trong quá trình truyền và khi lưu trữ) và ghi kiểm toán. Enterprise Edition của MongoDB cung cấp thêm các tính năng như tích hợp LDAP và xác thực Kerberos ở cấp độ doanh nghiệp. Các tính năng này giúp bảo vệ dữ liệu nhạy cảm đồng thời duy trì tuân thủ quy định ngành.

MongoDB có xử lý được các giao dịch ACID không?

Có, MongoDB hỗ trợ giao dịch tuân thủ ACID, đặc biệt từ phiên bản 4.0 trở đi. Điều này cho phép giao dịch đa tài liệu tương tự cơ sở dữ liệu quan hệ, đảm bảo tính nguyên vẹn, nhất quán, cô lập và bền vững cho các thao tác liên quan nhiều tài liệu hoặc collection. Điều này giúp MongoDB phù hợp hơn với các tình huống cần bảo đảm giao dịch.

Sự khác nhau giữa JSON và BSON trong MongoDB là gì?

Mặc dù JSON là định dạng có thể đọc bởi con người thường dùng để biểu diễn dữ liệu, BSON (Binary JSON) là định dạng lưu trữ của MongoDB. BSON cho phép lưu trữ và truy xuất dữ liệu hiệu quả hơn và hỗ trợ thêm các kiểu dữ liệu như ngày tháng và dữ liệu nhị phân, những thứ JSON không hỗ trợ nguyên bản. BSON cũng bổ sung thêm siêu dữ liệu, giúp cải thiện hiệu năng khi lưu trữ và truy xuất tài liệu.


Bexruz (Bex) Tuychiev's photo
Author
Bexruz (Bex) Tuychiev
LinkedIn

Tôi là người sáng tạo nội dung về khoa học dữ liệu với hơn 2 năm kinh nghiệm và là một trong những tài khoản có lượng người theo dõi lớn nhất trên Medium. Tôi thích viết các bài chuyên sâu về AI và ML với chút giọng điệu mỉa mai, vì bạn cũng phải làm gì đó để chúng bớt khô khan. Tôi đã xuất bản hơn 130 bài viết và một khóa học trên DataCamp, cùng với một khóa nữa đang được thực hiện. Nội dung của tôi đã được hơn 5 triệu lượt xem, trong đó 20 nghìn người đã trở thành người theo dõi trên cả Medium và LinkedIn. 

Chủ đề
Python
Kỹ thuật Dữ liệu

Bắt đầu hành trình Cơ sở dữ liệu phi quan hệ của bạn trên DataCamp ngay hôm nay!

Khóa học

Nhập môn MongoDB với Python

3 giờ
24.4K
Học cách thao tác và phân tích dữ liệu có cấu trúc linh hoạt bằng MongoDB.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm