MongoDB - Hướng dẫn nhanh

MongoDB là một cơ sở dữ liệu định hướng tài liệu, đa nền tảng cung cấp, hiệu suất cao, tính sẵn sàng cao và khả năng mở rộng dễ dàng. MongoDB hoạt động dựa trên khái niệm về bộ sưu tập và tài liệu.

Cơ sở dữ liệu

Cơ sở dữ liệu là một vùng chứa vật lý cho các bộ sưu tập. Mỗi cơ sở dữ liệu có một bộ tệp riêng trên hệ thống tệp. Một máy chủ MongoDB duy nhất thường có nhiều cơ sở dữ liệu.

Bộ sưu tập

Bộ sưu tập là một nhóm các tài liệu MongoDB. Nó tương đương với một bảng RDBMS. Một bộ sưu tập tồn tại trong một cơ sở dữ liệu duy nhất. Bộ sưu tập không thực thi một giản đồ. Các tài liệu trong bộ sưu tập có thể có các trường khác nhau. Thông thường, tất cả các tài liệu trong bộ sưu tập đều có mục đích tương tự hoặc có liên quan.

Tài liệu

Tài liệu là một tập hợp các cặp khóa-giá trị. Tài liệu có lược đồ động. Lược đồ động có nghĩa là các tài liệu trong cùng một bộ sưu tập không cần phải có cùng một nhóm trường hoặc cấu trúc và các trường chung trong tài liệu của một bộ sưu tập có thể chứa các loại dữ liệu khác nhau.

Bảng sau đây cho thấy mối quan hệ của thuật ngữ RDBMS với MongoDB.

RDBMS MongoDB
Cơ sở dữ liệu Cơ sở dữ liệu
Bàn Bộ sưu tập
Tuple / Row Tài liệu
cột Cánh đồng
Tham gia bảng Tài liệu được nhúng
Khóa chính Khóa chính (Khóa mặc định _id do chính mongodb cung cấp)
Máy chủ cơ sở dữ liệu và Máy khách
Mysqld / Oracle mongod
mysql / sqlplus mongo

Tài liệu mẫu

Ví dụ sau đây cho thấy cấu trúc tài liệu của một trang blog, đơn giản là một cặp giá trị khóa được phân tách bằng dấu phẩy.

{
   _id: ObjectId(7df78ad8902c)
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by: 'tutorials point',
   url: 'http://www.tutorialspoint.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100, 
   comments: [	
      {
         user:'user1',
         message: 'My first comment',
         dateCreated: new Date(2011,1,20,2,15),
         like: 0 
      },
      {
         user:'user2',
         message: 'My second comments',
         dateCreated: new Date(2011,1,25,7,45),
         like: 5
      }
   ]
}

_idlà một số thập lục phân 12 byte đảm bảo tính duy nhất của mọi tài liệu. Bạn có thể cung cấp _id trong khi chèn tài liệu. Nếu bạn không cung cấp thì MongoDB cung cấp một id duy nhất cho mọi tài liệu. 12 byte này 4 byte đầu tiên cho dấu thời gian hiện tại, 3 byte tiếp theo cho id máy, 2 byte tiếp theo cho id quy trình của máy chủ MongoDB và 3 byte còn lại là GIÁ TRỊ gia tăng đơn giản.

Bất kỳ cơ sở dữ liệu quan hệ nào cũng có thiết kế lược đồ điển hình hiển thị số lượng bảng và mối quan hệ giữa các bảng này. Trong khi trong MongoDB, không có khái niệm về mối quan hệ.

Ưu điểm của MongoDB so với RDBMS

  • Schema less- MongoDB là một cơ sở dữ liệu tài liệu trong đó một bộ sưu tập chứa các tài liệu khác nhau. Số lượng trường, nội dung và kích thước của tài liệu có thể khác nhau giữa các tài liệu.

  • Cấu trúc của một đối tượng duy nhất là rõ ràng.

  • Không có liên kết phức tạp.

  • Khả năng truy vấn sâu. MongoDB hỗ trợ các truy vấn động trên tài liệu bằng ngôn ngữ truy vấn dựa trên tài liệu gần như mạnh mẽ như SQL.

  • Tuning.

  • Ease of scale-out - MongoDB rất dễ mở rộng.

  • Chuyển đổi / ánh xạ các đối tượng ứng dụng sang các đối tượng cơ sở dữ liệu không cần thiết.

  • Sử dụng bộ nhớ trong để lưu bộ làm việc (cửa sổ), cho phép truy cập dữ liệu nhanh hơn.

Tại sao sử dụng MongoDB?

  • Document Oriented Storage - Dữ liệu được lưu trữ dưới dạng tài liệu kiểu JSON.

  • Lập chỉ mục trên bất kỳ thuộc tính nào

  • Nhân rộng và tính khả dụng cao

  • Auto-sharding

  • Truy vấn phong phú

  • Cập nhật tại chỗ nhanh chóng

  • Hỗ trợ chuyên nghiệp bởi MongoDB

Sử dụng MongoDB ở đâu?

  • Dữ liệu lớn
  • Quản lý và phân phối nội dung
  • Cơ sở hạ tầng xã hội và di động
  • Quản lý dữ liệu người dùng
  • Trung tâm dữ liệu

Bây giờ chúng ta hãy xem cách cài đặt MongoDB trên Windows.

Cài đặt MongoDB trên Windows

Để cài đặt MongoDB trên Windows, trước tiên hãy tải xuống bản phát hành mới nhất của MongoDB từ https://www.mongodb.org/downloads. Đảm bảo rằng bạn tải đúng phiên bản MongoDB tùy thuộc vào phiên bản Windows của bạn. Để tải phiên bản Windows của bạn, hãy mở dấu nhắc lệnh và thực hiện lệnh sau.

C:\>wmic os get osarchitecture
OSArchitecture
64-bit
C:\>

Phiên bản 32-bit của MongoDB chỉ hỗ trợ cơ sở dữ liệu nhỏ hơn 2GB và chỉ thích hợp cho mục đích thử nghiệm và đánh giá.

Bây giờ giải nén tệp đã tải xuống của bạn vào c: \ drive hoặc bất kỳ vị trí nào khác. Đảm bảo rằng tên của thư mục được giải nén là mongodb-win32-i386- [phiên bản] hoặc mongodb-win32-x86_64- [phiên bản]. Đây [phiên bản] là phiên bản tải xuống MongoDB.

Tiếp theo, mở dấu nhắc lệnh và chạy lệnh sau.

C:\>move mongodb-win64-* mongodb
   1 dir(s) moved.
C:\>

Trong trường hợp bạn đã giải nén MongoDB ở vị trí khác, hãy truy cập đường dẫn đó bằng lệnh cd FOLDER/DIR và bây giờ chạy quy trình đã cho ở trên.

MongoDB yêu cầu một thư mục dữ liệu để lưu trữ các tệp của nó. Vị trí mặc định cho thư mục dữ liệu MongoDB là c: \ data \ db. Vì vậy, bạn cần tạo thư mục này bằng Command Prompt. Thực hiện chuỗi lệnh sau.

C:\>md data
C:\md data\db

Nếu bạn phải cài đặt MongoDB ở một vị trí khác, thì bạn cần chỉ định một đường dẫn thay thế cho \data\db bằng cách thiết lập đường dẫn dbpath trong mongod.exe. Tương tự, hãy phát hành các lệnh sau.

Trong dấu nhắc lệnh, điều hướng đến thư mục bin có trong thư mục cài đặt MongoDB. Giả sử thư mục cài đặt của tôi làD:\set up\mongodb

C:\Users\XYZ>d:
D:\>cd "set up"
D:\set up>cd mongodb
D:\set up\mongodb>cd bin
D:\set up\mongodb\bin>mongod.exe --dbpath "d:\set up\mongodb\data"

Điều này sẽ hiển thị waiting for connections trên đầu ra bảng điều khiển, cho biết rằng quá trình mongod.exe đang chạy thành công.

Bây giờ để chạy MongoDB, bạn cần mở một dấu nhắc lệnh khác và đưa ra lệnh sau.

D:\set up\mongodb\bin>mongo.exe
MongoDB shell version: 2.4.6
connecting to: test
>db.test.save( { a: 1 } )
>db.test.find()
{ "_id" : ObjectId(5879b0f65a56a454), "a" : 1 }
>

Điều này sẽ cho thấy MongoDB đã được cài đặt và chạy thành công. Lần tới khi bạn chạy MongoDB, bạn chỉ cần đưa ra các lệnh.

D:\set up\mongodb\bin>mongod.exe --dbpath "d:\set up\mongodb\data" 
D:\set up\mongodb\bin>mongo.exe

Cài đặt MongoDB trên Ubuntu

Chạy lệnh sau để nhập khóa GPG công khai MongoDB -

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

Tạo tệp /etc/apt/sources.list.d/mongodb.list bằng lệnh sau.

echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' 
   | sudo tee /etc/apt/sources.list.d/mongodb.list

Bây giờ, hãy phát hành lệnh sau để cập nhật kho lưu trữ:

sudo apt-get update

Tiếp theo cài đặt MongoDB bằng cách sử dụng lệnh sau:

apt-get install mongodb-10gen = 2.2.3

Trong cài đặt trên, 2.2.3 hiện đang được phát hành phiên bản MongoDB. Đảm bảo luôn cài đặt phiên bản mới nhất. Bây giờ MongoDB đã được cài đặt thành công.

Khởi động MongoDB

sudo service mongodb start

Dừng MongoDB

sudo service mongodb stop

Khởi động lại MongoDB

sudo service mongodb restart

Để sử dụng MongoDB, hãy chạy lệnh sau.

mongo

Điều này sẽ kết nối bạn với phiên bản MongoDB đang chạy.

MongoDB Trợ giúp

Để nhận danh sách các lệnh, hãy nhập db.help()trong ứng dụng khách MongoDB. Thao tác này sẽ cung cấp cho bạn danh sách các lệnh như được hiển thị trong ảnh chụp màn hình sau.

MongoDB Thống kê

Để nhận số liệu thống kê về máy chủ MongoDB, hãy nhập lệnh db.stats()trong ứng dụng khách MongoDB. Điều này sẽ hiển thị tên cơ sở dữ liệu, số lượng bộ sưu tập và tài liệu trong cơ sở dữ liệu. Đầu ra của lệnh được hiển thị trong ảnh chụp màn hình sau.

Dữ liệu trong MongoDB có một schema.documents linh hoạt trong cùng một bộ sưu tập. Chúng không cần phải có cùng một nhóm trường hoặc cấu trúc và các trường chung trong tài liệu của tập hợp có thể chứa các loại dữ liệu khác nhau.

Một số lưu ý khi thiết kế Schema trong MongoDB

  • Thiết kế lược đồ của bạn theo yêu cầu của người dùng.

  • Kết hợp các đối tượng vào một tài liệu nếu bạn sẽ sử dụng chúng cùng nhau. Nếu không, hãy tách chúng ra (nhưng đảm bảo không cần nối).

  • Nhân bản dữ liệu (nhưng có giới hạn) vì dung lượng ổ đĩa rẻ hơn so với thời gian tính toán.

  • Tham gia trong khi viết, không phải khi đọc.

  • Tối ưu hóa lược đồ của bạn cho các trường hợp sử dụng thường xuyên nhất.

  • Thực hiện tổng hợp phức tạp trong lược đồ.

Thí dụ

Giả sử một khách hàng cần thiết kế cơ sở dữ liệu cho blog / trang web của mình và xem sự khác biệt giữa thiết kế lược đồ RDBMS và MongoDB. Trang web có các yêu cầu sau.

  • Mỗi bài đăng đều có tiêu đề, mô tả và url duy nhất.
  • Mỗi bài đăng có thể có một hoặc nhiều thẻ.
  • Mỗi bài đăng đều có tên nhà xuất bản và tổng số lượt thích.
  • Mỗi bài đăng đều có nhận xét do người dùng đưa ra cùng với tên, tin nhắn, thời gian dữ liệu và lượt thích của họ.
  • Trên mỗi bài đăng, có thể có không hoặc nhiều bình luận.

Trong lược đồ RDBMS, thiết kế cho các yêu cầu trên sẽ có tối thiểu ba bảng.

Trong khi ở trong lược đồ MongoDB, thiết kế sẽ có một bài thu thập và cấu trúc sau:

{
   _id: POST_ID
   title: TITLE_OF_POST, 
   description: POST_DESCRIPTION,
   by: POST_BY,
   url: URL_OF_POST,
   tags: [TAG1, TAG2, TAG3],
   likes: TOTAL_LIKES, 
   comments: [	
      {
         user:'COMMENT_BY',
         message: TEXT,
         dateCreated: DATE_TIME,
         like: LIKES 
      },
      {
         user:'COMMENT_BY',
         message: TEXT,
         dateCreated: DATE_TIME,
         like: LIKES
      }
   ]
}

Vì vậy, trong khi hiển thị dữ liệu, trong RDBMS, bạn cần phải nối ba bảng và trong MongoDB, dữ liệu sẽ chỉ được hiển thị từ một bộ sưu tập.

Trong chương này, chúng ta sẽ xem cách tạo cơ sở dữ liệu trong MongoDB.

Lệnh sử dụng

MongoDB use DATABASE_NAMEđược sử dụng để tạo cơ sở dữ liệu. Lệnh sẽ tạo một cơ sở dữ liệu mới nếu nó không tồn tại, nếu không nó sẽ trả về cơ sở dữ liệu hiện có.

Cú pháp

Cú pháp cơ bản của use DATABASE tuyên bố như sau:

use DATABASE_NAME

Thí dụ

Nếu bạn muốn sử dụng cơ sở dữ liệu có tên <mydb>, sau đó use DATABASE tuyên bố sẽ như sau:

>use mydb
switched to db mydb

Để kiểm tra cơ sở dữ liệu hiện được chọn của bạn, hãy sử dụng lệnh db

>db
mydb

Nếu bạn muốn kiểm tra danh sách cơ sở dữ liệu của mình, hãy sử dụng lệnh show dbs.

>show dbs
local     0.78125GB
test      0.23012GB

Cơ sở dữ liệu đã tạo của bạn (mydb) không có trong danh sách. Để hiển thị cơ sở dữ liệu, bạn cần phải chèn ít nhất một tài liệu vào đó.

>db.movie.insert({"name":"tutorials point"})
>show dbs
local      0.78125GB
mydb       0.23012GB
test       0.23012GB

Trong MongoDB cơ sở dữ liệu mặc định là thử nghiệm. Nếu bạn không tạo bất kỳ cơ sở dữ liệu nào, thì các bộ sưu tập sẽ được lưu trữ trong cơ sở dữ liệu thử nghiệm.

Trong chương này, chúng ta sẽ xem cách thả cơ sở dữ liệu bằng lệnh MongoDB.

Phương thức dropDatabase ()

MongoDB db.dropDatabase() lệnh được sử dụng để loại bỏ một cơ sở dữ liệu hiện có.

Cú pháp

Cú pháp cơ bản của dropDatabase() lệnh như sau:

db.dropDatabase()

Thao tác này sẽ xóa cơ sở dữ liệu đã chọn. Nếu bạn chưa chọn bất kỳ cơ sở dữ liệu nào, thì nó sẽ xóa cơ sở dữ liệu 'thử nghiệm' mặc định.

Thí dụ

Trước tiên, hãy kiểm tra danh sách các cơ sở dữ liệu có sẵn bằng cách sử dụng lệnh, show dbs.

>show dbs
local      0.78125GB
mydb       0.23012GB
test       0.23012GB
>

Nếu bạn muốn xóa cơ sở dữ liệu mới <mydb>, sau đó dropDatabase() lệnh sẽ như sau:

>use mydb
switched to db mydb
>db.dropDatabase()
>{ "dropped" : "mydb", "ok" : 1 }
>

Bây giờ kiểm tra danh sách cơ sở dữ liệu.

>show dbs
local      0.78125GB
test       0.23012GB
>

Trong chương này, chúng ta sẽ xem cách tạo một bộ sưu tập bằng MongoDB.

Phương thức createCollection ()

MongoDB db.createCollection(name, options) được sử dụng để tạo bộ sưu tập.

Cú pháp

Cú pháp cơ bản của createCollection() lệnh như sau:

db.createCollection(name, options)

Trong lệnh, name là tên của bộ sưu tập sẽ được tạo. Options là một tài liệu và được sử dụng để chỉ định cấu hình của bộ sưu tập.

Tham số Kiểu Sự miêu tả
Tên Chuỗi Tên của bộ sưu tập sẽ được tạo
Tùy chọn Tài liệu (Tùy chọn) Chỉ định các tùy chọn về kích thước bộ nhớ và lập chỉ mục

Tham số Options là tùy chọn, vì vậy bạn chỉ cần chỉ định tên của bộ sưu tập. Sau đây là danh sách các tùy chọn bạn có thể sử dụng:

Cánh đồng Kiểu Sự miêu tả
giới hạn Boolean (Tùy chọn) Nếu đúng, hãy bật bộ sưu tập có giới hạn. Bộ sưu tập có giới hạn là bộ sưu tập có kích thước cố định tự động ghi đè các mục nhập cũ nhất của nó khi nó đạt đến kích thước tối đa.If you specify true, you need to specify size parameter also.
autoIndexId Boolean (Tùy chọn) Nếu đúng, tự động tạo chỉ mục trên _id field.s Giá trị mặc định là sai.
kích thước con số (Tùy chọn) Chỉ định kích thước tối đa tính bằng byte cho bộ sưu tập có giới hạn. If capped is true, then you need to specify this field also.
tối đa con số (Tùy chọn) Chỉ định số lượng tài liệu tối đa được phép trong bộ sưu tập có giới hạn.

Trong khi chèn tài liệu, MongoDB trước tiên sẽ kiểm tra trường kích thước của bộ sưu tập giới hạn, sau đó kiểm tra trường tối đa.

Ví dụ

Cú pháp cơ bản của createCollection() phương pháp không có tùy chọn như sau:

>use test
switched to db test
>db.createCollection("mycollection")
{ "ok" : 1 }
>

Bạn có thể kiểm tra bộ sưu tập đã tạo bằng cách sử dụng lệnh show collections.

>show collections
mycollection
system.indexes

Ví dụ sau đây cho thấy cú pháp của createCollection() phương pháp với một số tùy chọn quan trọng -

>db.createCollection("mycol", { capped : true, autoIndexId : true, size : 
   6142800, max : 10000 } )
{ "ok" : 1 }
>

Trong MongoDB, bạn không cần tạo bộ sưu tập. MongoDB tự động tạo bộ sưu tập khi bạn chèn một số tài liệu.

>db.tutorialspoint.insert({"name" : "tutorialspoint"})
>show collections
mycol
mycollection
system.indexes
tutorialspoint
>

Trong chương này, chúng ta sẽ xem cách bỏ một bộ sưu tập bằng MongoDB.

Phương thức drop ()

MongoDB's db.collection.drop() được sử dụng để loại bỏ một bộ sưu tập từ cơ sở dữ liệu.

Cú pháp

Cú pháp cơ bản của drop() lệnh như sau:

db.COLLECTION_NAME.drop()

Thí dụ

Đầu tiên, hãy kiểm tra các bộ sưu tập có sẵn trong cơ sở dữ liệu của bạn mydb.

>use mydb
switched to db mydb
>show collections
mycol
mycollection
system.indexes
tutorialspoint
>

Bây giờ thả bộ sưu tập với tên mycollection.

>db.mycollection.drop()
true
>

Kiểm tra lại danh sách các bộ sưu tập vào cơ sở dữ liệu.

>show collections
mycol
system.indexes
tutorialspoint
>

drop () phương thức sẽ trả về true, nếu bộ sưu tập đã chọn được loại bỏ thành công, nếu không nó sẽ trả về false.

MongoDB hỗ trợ nhiều kiểu dữ liệu. Một số trong số họ là -

  • String- Đây là kiểu dữ liệu được sử dụng phổ biến nhất để lưu trữ dữ liệu. Chuỗi trong MongoDB phải hợp lệ UTF-8.

  • Integer- Loại này được sử dụng để lưu trữ một giá trị số. Số nguyên có thể là 32 bit hoặc 64 bit tùy thuộc vào máy chủ của bạn.

  • Boolean - Kiểu này được sử dụng để lưu trữ một giá trị boolean (true / false).

  • Double - Loại này dùng để lưu giá trị dấu phẩy động.

  • Min/ Max keys - Loại này được sử dụng để so sánh giá trị với phần tử BSON thấp nhất và cao nhất.

  • Arrays - Kiểu này dùng để lưu mảng hoặc liệt kê hoặc nhiều giá trị vào một khóa.

  • Timestamp- dấu kích thích. Điều này có thể hữu ích cho việc ghi khi một tài liệu đã được sửa đổi hoặc thêm vào.

  • Object - Kiểu dữ liệu này được sử dụng cho các tài liệu nhúng.

  • Null - Kiểu này dùng để lưu giá trị Null.

  • Symbol- Kiểu dữ liệu này được sử dụng giống nhau cho một chuỗi; tuy nhiên, nó thường dành riêng cho các ngôn ngữ sử dụng một loại ký hiệu cụ thể.

  • Date - Kiểu dữ liệu này được sử dụng để lưu trữ ngày hoặc giờ hiện tại ở định dạng thời gian UNIX. Bạn có thể chỉ định ngày giờ của riêng mình bằng cách tạo đối tượng Date và chuyển ngày, tháng, năm vào đó.

  • Object ID - Kiểu dữ liệu này được sử dụng để lưu trữ ID của tài liệu.

  • Binary data - Kiểu dữ liệu này được sử dụng để lưu trữ dữ liệu nhị phân.

  • Code - Kiểu dữ liệu này được sử dụng để lưu mã JavaScript vào tài liệu.

  • Regular expression - Kiểu dữ liệu này được sử dụng để lưu trữ biểu thức chính quy.

Trong chương này, chúng ta sẽ học cách chèn tài liệu trong MongoDB collection.

Phương thức insert ()

Để chèn dữ liệu vào bộ sưu tập MongoDB, bạn cần sử dụng MongoDB's insert() hoặc là save() phương pháp.

Cú pháp

Cú pháp cơ bản của insert() lệnh như sau:

>db.COLLECTION_NAME.insert(document)

Thí dụ

>db.mycol.insert({
   _id: ObjectId(7df78ad8902c),
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by: 'tutorials point',
   url: 'http://www.tutorialspoint.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
})

Đây mycollà tên bộ sưu tập của chúng tôi, như đã tạo trong chương trước. Nếu bộ sưu tập không tồn tại trong cơ sở dữ liệu, thì MongoDB sẽ tạo bộ sưu tập này và sau đó chèn tài liệu vào đó.

Trong tài liệu được chèn, nếu chúng ta không chỉ định tham số _id, thì MongoDB sẽ gán một ObjectId duy nhất cho tài liệu này.

_id là số thập lục phân 12 byte duy nhất cho mọi tài liệu trong bộ sưu tập. 12 byte được chia như sau:

_id: ObjectId(4 bytes timestamp, 3 bytes machine id, 2 bytes process id, 
   3 bytes incrementer)

Để chèn nhiều tài liệu trong một truy vấn, bạn có thể chuyển một mảng tài liệu trong lệnh insert ().

Thí dụ

>db.post.insert([
   {
      title: 'MongoDB Overview', 
      description: 'MongoDB is no sql database',
      by: 'tutorials point',
      url: 'http://www.tutorialspoint.com',
      tags: ['mongodb', 'database', 'NoSQL'],
      likes: 100
   },
	
   {
      title: 'NoSQL Database', 
      description: "NoSQL database doesn't have tables",
      by: 'tutorials point',
      url: 'http://www.tutorialspoint.com',
      tags: ['mongodb', 'database', 'NoSQL'],
      likes: 20, 
      comments: [	
         {
            user:'user1',
            message: 'My first comment',
            dateCreated: new Date(2013,11,10,2,35),
            like: 0 
         }
      ]
   }
])

Để chèn tài liệu, bạn có thể sử dụng db.post.save(document)cũng thế. Nếu bạn không chỉ định_id trong tài liệu sau đó save() phương pháp sẽ hoạt động giống như insert()phương pháp. Nếu bạn chỉ định _id thì nó sẽ thay thế toàn bộ dữ liệu của tài liệu chứa _id như được chỉ định trong phương thức save ().

Trong chương này, chúng ta sẽ học cách truy vấn tài liệu từ bộ sưu tập MongoDB.

Phương thức find ()

Để truy vấn dữ liệu từ bộ sưu tập MongoDB, bạn cần sử dụng MongoDB's find() phương pháp.

Cú pháp

Cú pháp cơ bản của find() phương pháp như sau:

>db.COLLECTION_NAME.find()

find() phương thức sẽ hiển thị tất cả các tài liệu theo cách không có cấu trúc.

Phương thức khá ()

Để hiển thị kết quả theo định dạng, bạn có thể sử dụng pretty() phương pháp.

Cú pháp

>db.mycol.find().pretty()

Thí dụ

>db.mycol.find().pretty()
{
   "_id": ObjectId(7df78ad8902c),
   "title": "MongoDB Overview", 
   "description": "MongoDB is no sql database",
   "by": "tutorials point",
   "url": "http://www.tutorialspoint.com",
   "tags": ["mongodb", "database", "NoSQL"],
   "likes": "100"
}
>

Ngoài phương thức find (), có findOne() phương thức này chỉ trả về một tài liệu.

RDBMS Nơi Tương đương Điều khoản trong MongoDB

Để truy vấn tài liệu trên cơ sở một số điều kiện, bạn có thể sử dụng các thao tác sau.

Hoạt động Cú pháp Thí dụ RDBMS tương đương
Bình đẳng {<khóa>: <giá trị>} db.mycol.find ({"theo": "điểm hướng dẫn"}). khá () where by = 'tutorial point'
Ít hơn {<khóa>: {$ lt: <value>}} db.mycol.find ({"thích": {$ lt: 50}}). khá () nơi thích <50
Nhỏ hơn bằng {<khóa>: {$ lte: <value>}} db.mycol.find ({"thích": {$ lte: 50}}). khá () nơi thích <= 50
Lớn hơn {<khóa>: {$ gt: <value>}} db.mycol.find ({"thích": {$ gt: 50}}). khá () nơi thích> 50
Lớn hơn bằng {<khóa>: {$ gte: <value>}} db.mycol.find ({"thích": {$ gte: 50}}). khá () nơi thích> = 50
Không bằng {<khóa>: {$ ne: <value>}} db.mycol.find ({"thích": {$ ne: 50}}). khá () nơi thích! = 50

VÀ trong MongoDB

Cú pháp

bên trong find() , nếu bạn chuyển nhiều khóa bằng cách tách chúng bằng ',' thì MongoDB sẽ coi nó là ANDtình trạng. Sau đây là cú pháp cơ bản củaAND -

>db.mycol.find(
   {
      $and: [
         {key1: value1}, {key2:value2}
      ]
   }
).pretty()

Thí dụ

Ví dụ sau sẽ hiển thị tất cả các hướng dẫn được viết bởi 'tutorial point' và có tiêu đề là 'MongoDB Overview'.

>db.mycol.find({$and:[{"by":"tutorials point"},{"title": "MongoDB Overview"}]}).pretty() {
   "_id": ObjectId(7df78ad8902c),
   "title": "MongoDB Overview", 
   "description": "MongoDB is no sql database",
   "by": "tutorials point",
   "url": "http://www.tutorialspoint.com",
   "tags": ["mongodb", "database", "NoSQL"],
   "likes": "100"
}

Đối với ví dụ đã cho ở trên, mệnh đề where tương đương sẽ là ' where by = 'tutorials point' AND title = 'MongoDB Overview' '. Bạn có thể chuyển bất kỳ số lượng cặp khóa, cặp giá trị nào trong mệnh đề tìm.

HOẶC trong MongoDB

Cú pháp

Để truy vấn tài liệu dựa trên điều kiện HOẶC, bạn cần sử dụng $ortừ khóa. Sau đây là cú pháp cơ bản củaOR -

>db.mycol.find(
   {
      $or: [
         {key1: value1}, {key2:value2}
      ]
   }
).pretty()

Thí dụ

Ví dụ sau sẽ hiển thị tất cả các hướng dẫn được viết bởi 'hướng dẫn điểm' hoặc có tiêu đề là 'Tổng quan về MongoDB'.

>db.mycol.find({$or:[{"by":"tutorials point"},{"title": "MongoDB Overview"}]}).pretty()
{
   "_id": ObjectId(7df78ad8902c),
   "title": "MongoDB Overview", 
   "description": "MongoDB is no sql database",
   "by": "tutorials point",
   "url": "http://www.tutorialspoint.com",
   "tags": ["mongodb", "database", "NoSQL"],
   "likes": "100"
}
>

Sử dụng AND và OR cùng nhau

Thí dụ

Ví dụ sau sẽ hiển thị các tài liệu có lượt thích lớn hơn 10 và có tiêu đề là 'Tổng quan về MongoDB' hoặc bằng 'điểm hướng dẫn'. SQL tương đương trong đó mệnh đề là'where likes>10 AND (by = 'tutorials point' OR title = 'MongoDB Overview')'

>db.mycol.find({"likes": {$gt:10}, $or: [{"by": "tutorials point"},
   {"title": "MongoDB Overview"}]}).pretty()
{
   "_id": ObjectId(7df78ad8902c),
   "title": "MongoDB Overview", 
   "description": "MongoDB is no sql database",
   "by": "tutorials point",
   "url": "http://www.tutorialspoint.com",
   "tags": ["mongodb", "database", "NoSQL"],
   "likes": "100"
}
>

MongoDB's update()save()các phương pháp được sử dụng để cập nhật tài liệu vào một bộ sưu tập. Phương thức update () cập nhật các giá trị trong tài liệu hiện có trong khi phương thức save () thay thế tài liệu hiện có bằng tài liệu được truyền trong phương thức save ().

Phương thức MongoDB Update ()

Phương thức update () cập nhật các giá trị trong tài liệu hiện có.

Cú pháp

Cú pháp cơ bản của update() phương pháp như sau:

>db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA)

Thí dụ

Hãy xem xét bộ sưu tập mycol có dữ liệu sau đây.

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

Ví dụ sau sẽ đặt tiêu đề mới là 'Hướng dẫn MongoDB mới' cho các tài liệu có tiêu đề là 'Tổng quan về MongoDB'.

>db.mycol.update({'title':'MongoDB Overview'},{$set:{'title':'New MongoDB Tutorial'}})
>db.mycol.find()
{ "_id" : ObjectId(5983548781331adf45ec5), "title":"New MongoDB Tutorial"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}
>

Theo mặc định, MongoDB sẽ chỉ cập nhật một tài liệu duy nhất. Để cập nhật nhiều tài liệu, bạn cần đặt tham số 'multi' thành true.

>db.mycol.update({'title':'MongoDB Overview'},
   {$set:{'title':'New MongoDB Tutorial'}},{multi:true})

Phương thức MongoDB Save ()

Các save() phương thức thay thế tài liệu hiện có bằng tài liệu mới được truyền trong phương thức save ().

Cú pháp

Cú pháp cơ bản của MongoDB save() phương pháp được hiển thị bên dưới -

>db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA})

Thí dụ

Ví dụ sau sẽ thay thế tài liệu bằng _id '5983548781331adf45ec5'.

>db.mycol.save(
   {
      "_id" : ObjectId(5983548781331adf45ec5), "title":"Tutorials Point New Topic",
      "by":"Tutorials Point"
   }
)
>db.mycol.find()
{ "_id" : ObjectId(5983548781331adf45ec5), "title":"Tutorials Point New Topic",
   "by":"Tutorials Point"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}
>

Trong chương này, chúng ta sẽ học cách xóa tài liệu bằng MongoDB.

Phương thức remove ()

MongoDB's remove()được sử dụng để xóa một tài liệu khỏi bộ sưu tập. Phương thức remove () chấp nhận hai tham số. Một là tiêu chí xóa và thứ hai là cờ justOne.

  • deletion criteria - (Tùy chọn) tiêu chí xóa theo tài liệu sẽ bị xóa.

  • justOne - (Tùy chọn) nếu được đặt thành true hoặc 1, thì chỉ xóa một tài liệu.

Cú pháp

Cú pháp cơ bản của remove() phương pháp như sau:

>db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)

Thí dụ

Hãy xem xét bộ sưu tập mycol có dữ liệu sau đây.

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

Ví dụ sau sẽ xóa tất cả các tài liệu có tiêu đề là 'Tổng quan về MongoDB'.

>db.mycol.remove({'title':'MongoDB Overview'})
>db.mycol.find()
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}
>

Chỉ xóa một

Nếu có nhiều bản ghi và bạn chỉ muốn xóa bản ghi đầu tiên, thì hãy đặt justOne tham số trong remove() phương pháp.

>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)

Xóa tất cả tài liệu

Nếu bạn không chỉ định tiêu chí xóa, thì MongoDB sẽ xóa toàn bộ tài liệu khỏi bộ sưu tập. This is equivalent of SQL's truncate command.

>db.mycol.remove({})
>db.mycol.find()
>

Trong MongoDB, phép chiếu có nghĩa là chỉ chọn dữ liệu cần thiết thay vì chọn toàn bộ dữ liệu của tài liệu. Nếu tài liệu có 5 trường và bạn chỉ cần hiển thị 3 trường, thì chỉ chọn 3 trường từ chúng.

Phương thức find ()

MongoDB's find(), được giải thích trong Tài liệu truy vấn MongoDB chấp nhận tham số tùy chọn thứ hai là danh sách các trường mà bạn muốn truy xuất. Trong MongoDB, khi bạn thực thifind(), sau đó nó hiển thị tất cả các trường của một tài liệu. Để hạn chế điều này, bạn cần đặt danh sách các trường có giá trị 1 hoặc 0. 1 được sử dụng để hiển thị trường trong khi 0 được sử dụng để ẩn các trường.

Cú pháp

Cú pháp cơ bản của find() phương pháp với phép chiếu như sau:

>db.COLLECTION_NAME.find({},{KEY:1})

Thí dụ

Hãy xem xét bộ sưu tập mycol có dữ liệu sau:

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

Ví dụ sau sẽ hiển thị tiêu đề của tài liệu trong khi truy vấn tài liệu.

>db.mycol.find({},{"title":1,_id:0})
{"title":"MongoDB Overview"}
{"title":"NoSQL Overview"}
{"title":"Tutorials Point Overview"}
>

Xin lưu ý _id trường luôn được hiển thị trong khi thực thi find() , nếu bạn không muốn trường này, thì bạn cần đặt nó là 0.

Trong chương này, chúng ta sẽ học cách giới hạn bản ghi bằng MongoDB.

Phương thức Giới hạn ()

Để giới hạn các bản ghi trong MongoDB, bạn cần sử dụng limit()phương pháp. Phương thức chấp nhận một đối số kiểu số, là số tài liệu mà bạn muốn được hiển thị.

Cú pháp

Cú pháp cơ bản của limit() phương pháp như sau:

>db.COLLECTION_NAME.find().limit(NUMBER)

Thí dụ

Hãy xem xét bộ sưu tập myycol có dữ liệu sau đây.

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

Ví dụ sau sẽ chỉ hiển thị hai tài liệu trong khi truy vấn tài liệu.

>db.mycol.find({},{"title":1,_id:0}).limit(2)
{"title":"MongoDB Overview"}
{"title":"NoSQL Overview"}
>

Nếu bạn không chỉ định đối số number trong limit() sau đó nó sẽ hiển thị tất cả các tài liệu từ bộ sưu tập.

Phương thức MongoDB Skip ()

Ngoài phương thức limit (), có một phương thức khác skip() cũng chấp nhận đối số kiểu số và được sử dụng để bỏ qua số lượng tài liệu.

Cú pháp

Cú pháp cơ bản của skip() phương pháp như sau:

>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

Thí dụ

Ví dụ sau sẽ chỉ hiển thị tài liệu thứ hai.

>db.mycol.find({},{"title":1,_id:0}).limit(1).skip(1)
{"title":"NoSQL Overview"}
>

Xin lưu ý, giá trị mặc định trong skip() phương thức là 0.

Trong chương này, chúng ta sẽ học cách sắp xếp các bản ghi trong MongoDB.

Phương thức sort ()

Để sắp xếp tài liệu trong MongoDB, bạn cần sử dụng sort()phương pháp. Phương thức chấp nhận một tài liệu chứa danh sách các trường cùng với thứ tự sắp xếp của chúng. Để chỉ định thứ tự sắp xếp 1 và -1 được sử dụng. 1 được sử dụng cho thứ tự tăng dần trong khi -1 được sử dụng cho thứ tự giảm dần.

Cú pháp

Cú pháp cơ bản của sort() phương pháp như sau:

>db.COLLECTION_NAME.find().sort({KEY:1})

Thí dụ

Hãy xem xét bộ sưu tập myycol có dữ liệu sau đây.

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

Ví dụ sau sẽ hiển thị các tài liệu được sắp xếp theo tiêu đề theo thứ tự giảm dần.

>db.mycol.find({},{"title":1,_id:0}).sort({"title":-1})
{"title":"Tutorials Point Overview"}
{"title":"NoSQL Overview"}
{"title":"MongoDB Overview"}
>

Xin lưu ý, nếu bạn không chỉ định tùy chọn sắp xếp, thì sort() phương thức sẽ hiển thị các tài liệu theo thứ tự tăng dần.

Các chỉ mục hỗ trợ giải quyết các truy vấn hiệu quả. Không có chỉ mục, MongoDB phải quét mọi tài liệu của bộ sưu tập để chọn những tài liệu phù hợp với câu lệnh truy vấn. Quá trình quét này rất kém hiệu quả và yêu cầu MongoDB xử lý một lượng lớn dữ liệu.

Chỉ mục là cấu trúc dữ liệu đặc biệt, lưu trữ một phần nhỏ của tập dữ liệu ở dạng dễ xem qua. Chỉ mục lưu trữ giá trị của một trường cụ thể hoặc tập hợp các trường, được sắp xếp theo giá trị của trường như được chỉ định trong chỉ mục.

Phương thức ensureIndex ()

Để tạo chỉ mục, bạn cần sử dụng phương thức ensureIndex () của MongoDB.

Cú pháp

Cú pháp cơ bản của ensureIndex() phương thức như sau ().

>db.COLLECTION_NAME.ensureIndex({KEY:1})

Đây là tên của trường mà bạn muốn tạo chỉ mục và 1 là cho thứ tự tăng dần. Để tạo chỉ mục theo thứ tự giảm dần, bạn cần sử dụng -1.

Thí dụ

>db.mycol.ensureIndex({"title":1})
>

Trong ensureIndex() bạn có thể chuyển nhiều trường để tạo chỉ mục trên nhiều trường.

>db.mycol.ensureIndex({"title":1,"description":-1})
>

ensureIndex()phương thức cũng chấp nhận danh sách các tùy chọn (là tùy chọn). Sau đây là danh sách -

Tham số Kiểu Sự miêu tả
lý lịch Boolean Xây dựng chỉ mục trong nền để việc tạo chỉ mục không chặn các hoạt động cơ sở dữ liệu khác. Chỉ định true để xây dựng trong nền. Giá trị mặc định làfalse.
độc nhất Boolean Tạo một chỉ mục duy nhất để bộ sưu tập sẽ không chấp nhận việc chèn các tài liệu trong đó khóa chỉ mục hoặc các khóa khớp với giá trị hiện có trong chỉ mục. Chỉ định true để tạo chỉ mục duy nhất. Giá trị mặc định làfalse.
Tên chuỗi Tên của chỉ mục. Nếu không xác định, MongoDB tạo tên chỉ mục bằng cách ghép tên của các trường được lập chỉ mục và thứ tự sắp xếp.
dropDups Boolean Tạo một chỉ mục duy nhất trên một trường có thể có các bản sao. MongoDB chỉ lập chỉ mục lần xuất hiện đầu tiên của một khóa và xóa tất cả tài liệu khỏi bộ sưu tập có chứa các lần xuất hiện tiếp theo của khóa đó. Chỉ định true để tạo chỉ mục duy nhất. Giá trị mặc định làfalse.
thưa thớt Boolean Nếu đúng, chỉ mục chỉ tham chiếu các tài liệu có trường được chỉ định. Các chỉ mục này sử dụng ít không gian hơn nhưng hoạt động khác nhau trong một số trường hợp (đặc biệt là các loại). Giá trị mặc định làfalse.
expireAfterSeconds số nguyên Chỉ định một giá trị, tính bằng giây, làm TTL để kiểm soát thời gian MongoDB lưu giữ các tài liệu trong bộ sưu tập này.
v phiên bản chỉ mục Số phiên bản chỉ mục. Phiên bản chỉ mục mặc định phụ thuộc vào phiên bản MongoDB đang chạy khi tạo chỉ mục.
trọng lượng tài liệu Trọng số là một số nằm trong khoảng từ 1 đến 99,999 và biểu thị tầm quan trọng của trường so với các trường được lập chỉ mục khác về điểm số.
ngôn ngữ mặc định chuỗi Đối với chỉ mục văn bản, ngôn ngữ xác định danh sách các từ dừng và các quy tắc cho trình tạo gốc và trình mã hóa. Giá trị mặc định làenglish.
language_override chuỗi Đối với chỉ mục văn bản, hãy chỉ định tên của trường trong tài liệu chứa, ngôn ngữ để ghi đè ngôn ngữ mặc định. Giá trị mặc định là ngôn ngữ.

Hoạt động tổng hợp xử lý hồ sơ dữ liệu và trả về kết quả đã tính toán. Thao tác tổng hợp nhóm các giá trị từ nhiều tài liệu lại với nhau và có thể thực hiện nhiều thao tác trên dữ liệu được nhóm để trả về một kết quả duy nhất. Trong SQL count (*) và với group by tương đương với tổng hợp mongodb.

Phương thức tổng hợp ()

Để tổng hợp trong MongoDB, bạn nên sử dụng aggregate() phương pháp.

Cú pháp

Cú pháp cơ bản của aggregate() phương pháp như sau:

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

Thí dụ

Trong bộ sưu tập, bạn có dữ liệu sau:

{
   _id: ObjectId(7df78ad8902c)
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by_user: 'tutorials point',
   url: 'http://www.tutorialspoint.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
},
{
   _id: ObjectId(7df78ad8902d)
   title: 'NoSQL Overview', 
   description: 'No sql database is very fast',
   by_user: 'tutorials point',
   url: 'http://www.tutorialspoint.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 10
},
{
   _id: ObjectId(7df78ad8902e)
   title: 'Neo4j Overview', 
   description: 'Neo4j is no sql database',
   by_user: 'Neo4j',
   url: 'http://www.neo4j.com',
   tags: ['neo4j', 'database', 'NoSQL'],
   likes: 750
},

Bây giờ từ bộ sưu tập ở trên, nếu bạn muốn hiển thị một danh sách cho biết có bao nhiêu hướng dẫn được viết bởi mỗi người dùng, thì bạn sẽ sử dụng như sau aggregate() phương pháp -

> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{
   "result" : [
      {
         "_id" : "tutorials point",
         "num_tutorial" : 2
      },
      {
         "_id" : "Neo4j",
         "num_tutorial" : 1
      }
   ],
   "ok" : 1
}
>

Truy vấn tương đương Sql cho trường hợp sử dụng trên sẽ là select by_user, count(*) from mycol group by by_user.

Trong ví dụ trên, chúng tôi đã nhóm các tài liệu theo trường by_uservà trên mỗi lần xuất hiện của by_user, giá trị trước đó của tổng được tăng lên. Sau đây là danh sách các biểu thức tổng hợp có sẵn.

Biểu hiện Sự miêu tả Thí dụ
$ sum Tính tổng giá trị đã xác định từ tất cả các tài liệu trong bộ sưu tập. db.mycol.aggregate ([{$ group: {_id: "$by_user", num_tutorial : {$sum: "$ like"}}}])
$ trung bình Tính giá trị trung bình của tất cả các giá trị đã cho từ tất cả các tài liệu trong bộ sưu tập. db.mycol.aggregate ([{$group : {_id : "$by_user ", num_tutorial: {$avg : "$thích "}}}])
$ min Nhận giá trị tối thiểu tương ứng từ tất cả các tài liệu trong bộ sưu tập. db.mycol.aggregate ([{$ group: {_id: "$by_user", num_tutorial : {$tối thiểu: "$ like"}}}])
$ tối đa Nhận tối đa giá trị tương ứng từ tất cả các tài liệu trong bộ sưu tập. db.mycol.aggregate ([{$group : {_id : "$by_user ", num_tutorial: {$max : "$thích "}}}])
$ push Chèn giá trị vào một mảng trong tài liệu kết quả. db.mycol.aggregate ([{$ group: {_id: "$by_user", url : {$đẩy: "$ url"}}}])
$ addToSet Chèn giá trị vào một mảng trong tài liệu kết quả nhưng không tạo bản sao. db.mycol.aggregate ([{$group : {_id : "$by_user ", url: {$addToSet : "$url "}}}])
$ đầu tiên Lấy tài liệu đầu tiên từ các tài liệu nguồn theo cách phân nhóm. Thông thường, điều này chỉ có ý nghĩa cùng với một số -stage “$ sort” được áp dụng trước đây. db.mycol.aggregate ([{$group : {_id : "$by_user ", first_url: {$first : "$url "}}}])
$ cuối cùng Lấy tài liệu cuối cùng từ các tài liệu nguồn theo nhóm. Thông thường, điều này chỉ có ý nghĩa cùng với một số -stage “$ sort” được áp dụng trước đây. db.mycol.aggregate ([{$group : {_id : "$by_user ", last_url: {$last : "$url "}}}])

Khái niệm đường ống

Trong lệnh UNIX, đường ống dẫn có nghĩa là khả năng thực hiện một thao tác trên một số đầu vào và sử dụng đầu ra làm đầu vào cho lệnh tiếp theo, v.v. MongoDB cũng hỗ trợ khái niệm tương tự trong khung tập hợp. Có một tập hợp các giai đoạn có thể xảy ra và mỗi giai đoạn đó được coi là một tập hợp tài liệu làm đầu vào và tạo ra một tập hợp tài liệu kết quả (hoặc tài liệu JSON kết quả cuối cùng ở cuối quy trình). Điều này sau đó có thể lần lượt được sử dụng cho giai đoạn tiếp theo, v.v.

Sau đây là các giai đoạn có thể có trong khuôn khổ tổng hợp -

  • $project - Được sử dụng để chọn một số trường cụ thể từ một tập hợp.

  • $match - Đây là một hoạt động lọc và do đó, điều này có thể giảm số lượng tài liệu được cung cấp làm đầu vào cho giai đoạn tiếp theo.

  • $group - Điều này thực hiện tổng hợp thực tế như đã thảo luận ở trên.

  • $sort - Sắp xếp các tài liệu.

  • $skip - Với điều này, có thể bỏ qua chuyển tiếp trong danh sách tài liệu cho một lượng tài liệu nhất định.

  • $limit - Điều này giới hạn số lượng tài liệu cần xem, bởi số lượng nhất định bắt đầu từ các vị trí hiện tại.

  • $unwind- Điều này được sử dụng để giải phóng tài liệu đang sử dụng mảng. Khi sử dụng một mảng, dữ liệu là loại được nối trước và thao tác này sẽ được hoàn tác với thao tác này để có lại các tài liệu riêng lẻ. Như vậy với giai đoạn này chúng ta sẽ tăng lượng tài liệu cho giai đoạn tiếp theo.

Replication là quá trình đồng bộ hóa dữ liệu giữa nhiều máy chủ. Nhân rộng cung cấp khả năng dự phòng và tăng tính khả dụng của dữ liệu với nhiều bản sao dữ liệu trên các máy chủ cơ sở dữ liệu khác nhau. Nhân rộng bảo vệ cơ sở dữ liệu khỏi sự mất mát của một máy chủ. Nhân rộng cũng cho phép bạn phục hồi sau lỗi phần cứng và gián đoạn dịch vụ. Với các bản sao bổ sung của dữ liệu, bạn có thể dành một bản sao để khôi phục, báo cáo hoặc sao lưu sau thảm họa.

Tại sao lại nhân rộng?

  • Để giữ an toàn cho dữ liệu của bạn
  • Tính khả dụng của dữ liệu cao (24 * 7)
  • Khôi phục thảm họa
  • Không có thời gian chết để bảo trì (như sao lưu, xây dựng lại chỉ mục, nén)
  • Đọc chia tỷ lệ (các bản sao bổ sung để đọc từ đó)
  • Bộ bản sao là minh bạch đối với ứng dụng

Cách nhân rộng hoạt động trong MongoDB

MongoDB đạt được sự nhân rộng bằng cách sử dụng bộ bản sao. Một tập hợp bản sao là một nhómmongodcác phiên bản lưu trữ cùng một tập dữ liệu. Trong một bản sao, một nút là nút chính nhận tất cả các thao tác ghi. Tất cả các bản sao khác, chẳng hạn như bản thứ hai, áp dụng các phép toán từ bản chính để chúng có cùng một tập dữ liệu. Tập hợp bản sao chỉ có thể có một nút chính.

  • Tập hợp bản sao là một nhóm gồm hai hoặc nhiều nút (thường tối thiểu phải có 3 nút).

  • Trong một tập hợp bản sao, một nút là nút chính và các nút còn lại là nút phụ.

  • Tất cả dữ liệu sao chép từ nút chính sang nút phụ.

  • Tại thời điểm tự động chuyển đổi dự phòng hoặc bảo trì, thiết lập bầu cử cho chính và một nút chính mới được bầu.

  • Sau khi khôi phục nút bị lỗi, nó lại tham gia vào tập hợp bản sao và hoạt động như một nút phụ.

Một sơ đồ điển hình về sao chép MongoDB được hiển thị trong đó ứng dụng khách luôn tương tác với nút chính và nút chính sau đó sao chép dữ liệu sang các nút phụ.

Tính năng của bộ bản sao

  • Một cụm N nút
  • Bất kỳ một nút nào cũng có thể là nút chính
  • Tất cả các hoạt động ghi chuyển đến chính
  • Chuyển đổi dự phòng tự động
  • Phục hồi tự động
  • Sự đồng thuận bầu cử sơ bộ

Thiết lập một bộ bản sao

Trong hướng dẫn này, chúng tôi sẽ chuyển đổi cá thể MongoDB độc lập thành một tập hợp bản sao. Để chuyển đổi sang tập hợp bản sao, sau đây là các bước:

  • Đã tắt máy chủ MongoDB.

  • Khởi động máy chủ MongoDB bằng cách chỉ định - tùy chọn replSet. Sau đây là cú pháp cơ bản của --replSet -

mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"

Thí dụ

mongod --port 27017 --dbpath "D:\set up\mongodb\data" --replSet rs0
  • Nó sẽ bắt đầu một cá thể mongod với tên rs0, trên cổng 27017.

  • Bây giờ bắt đầu dấu nhắc lệnh và kết nối với phiên bản mongod này.

  • Trong ứng dụng khách Mongo, hãy phát hành lệnh rs.initiate() để bắt đầu một tập hợp bản sao mới.

  • Để kiểm tra cấu hình bộ bản sao, hãy ra lệnh rs.conf(). Để kiểm tra trạng thái của tập hợp bản sao, hãy sử dụng lệnhrs.status().

Thêm thành viên vào tập hợp bản sao

Để thêm thành viên vào tập hợp bản sao, hãy bắt đầu các phiên bản mongod trên nhiều máy. Bây giờ hãy bắt đầu một ứng dụng khách mongo và ra lệnhrs.add().

Cú pháp

Cú pháp cơ bản của rs.add() lệnh như sau:

>rs.add(HOST_NAME:PORT)

Thí dụ

Giả sử tên phiên bản mongod của bạn là mongod1.net và nó đang chạy trên cảng 27017. Để thêm phiên bản này vào tập hợp bản sao, hãy ra lệnhrs.add() trong ứng dụng khách Mongo.

>rs.add("mongod1.net:27017")
>

Bạn có thể thêm cá thể mongod vào tập hợp bản sao chỉ khi bạn được kết nối với nút chính. Để kiểm tra xem bạn đã kết nối với chính hay chưa, hãy ra lệnhdb.isMaster() trong ứng dụng mongo.

Sharding là quá trình lưu trữ các bản ghi dữ liệu trên nhiều máy và đây là cách tiếp cận của MongoDB để đáp ứng nhu cầu tăng trưởng dữ liệu. Khi kích thước của dữ liệu tăng lên, một máy đơn lẻ có thể không đủ để lưu trữ dữ liệu cũng như không cung cấp thông lượng đọc và ghi có thể chấp nhận được. Sharding giải quyết vấn đề với tỷ lệ theo chiều ngang. Với sharding, bạn thêm nhiều máy hơn để hỗ trợ tăng trưởng dữ liệu và nhu cầu của các hoạt động đọc và ghi.

Tại sao Sharding?

  • Trong sao chép, tất cả các lần ghi đều đi đến nút chính
  • Các truy vấn nhạy cảm về độ trễ vẫn được xem là chính
  • Tập hợp bản sao đơn có giới hạn là 12 nút
  • Bộ nhớ không thể đủ lớn khi tập dữ liệu hoạt động lớn
  • Đĩa cục bộ không đủ lớn
  • Chia tỷ lệ dọc quá đắt

Sharding trong MongoDB

Biểu đồ sau đây cho thấy sharding trong MongoDB bằng cách sử dụng cụm phân đoạn.

Trong sơ đồ sau, có ba thành phần chính:

  • Shards- Các mảnh được sử dụng để lưu trữ dữ liệu. Chúng cung cấp tính khả dụng cao và tính nhất quán dữ liệu. Trong môi trường sản xuất, mỗi phân đoạn là một tập hợp bản sao riêng biệt.

  • Config Servers- Máy chủ cấu hình lưu trữ siêu dữ liệu của cụm. Dữ liệu này chứa một ánh xạ tập dữ liệu của cụm thành các phân đoạn. Bộ định tuyến truy vấn sử dụng siêu dữ liệu này để nhắm mục tiêu hoạt động tới các phân đoạn cụ thể. Trong môi trường sản xuất, các cụm phân đoạn có chính xác 3 máy chủ cấu hình.

  • Query Routers- Các bộ định tuyến truy vấn về cơ bản là các cá thể mongo, giao diện với các ứng dụng khách và các hoạt động trực tiếp đến phân đoạn thích hợp. Bộ định tuyến truy vấn xử lý và nhắm mục tiêu các hoạt động đến các phân đoạn và sau đó trả về kết quả cho máy khách. Một cụm phân đoạn có thể chứa nhiều hơn một bộ định tuyến truy vấn để phân chia tải yêu cầu của máy khách. Máy khách gửi yêu cầu đến một bộ định tuyến truy vấn. Nói chung, một cụm phân đoạn có nhiều bộ định tuyến truy vấn.

Trong chương này, chúng ta sẽ xem cách tạo bản sao lưu trong MongoDB.

Dump MongoDB dữ liệu

Để tạo bản sao lưu cơ sở dữ liệu trong MongoDB, bạn nên sử dụng mongodumpchỉ huy. Lệnh này sẽ kết xuất toàn bộ dữ liệu của máy chủ của bạn vào thư mục kết xuất. Có nhiều tùy chọn có sẵn để bạn có thể giới hạn số lượng dữ liệu hoặc tạo bản sao lưu máy chủ từ xa của mình.

Cú pháp

Cú pháp cơ bản của mongodump lệnh như sau:

>mongodump

Thí dụ

Khởi động máy chủ mongod của bạn. Giả sử rằng máy chủ mongod của bạn đang chạy trên localhost và cổng 27017, hãy mở dấu nhắc lệnh và chuyển đến thư mục bin của phiên bản mongodb của bạn và nhập lệnhmongodump

Hãy xem xét bộ sưu tập mycol có dữ liệu sau đây.

>mongodump

Lệnh sẽ kết nối với máy chủ đang chạy tại 127.0.0.1 và cảng 27017 và sao lưu tất cả dữ liệu của máy chủ vào thư mục /bin/dump/. Sau đây là đầu ra của lệnh:

Sau đây là danh sách các tùy chọn có sẵn có thể được sử dụng với mongodump chỉ huy.

Cú pháp Sự miêu tả Thí dụ
mongodump - máy chủ HOST_NAME - cổng PORT_NUMBER Lệnh này sẽ sao lưu tất cả các cơ sở dữ liệu của cá thể mongod được chỉ định. mongodump --host tutorialspoint.com --port 27017
mongodump --dbpath DB_PATH --out BACKUP_DIRECTORY Lệnh này sẽ chỉ sao lưu cơ sở dữ liệu được chỉ định tại đường dẫn được chỉ định. mongodump --dbpath / data / db / --out / data / backup /
mongodump --collection COLLECTION --db DB_NAME Lệnh này sẽ chỉ sao lưu bộ sưu tập cơ sở dữ liệu được chỉ định. mongodump --collection mycol --db test

Khôi phục dữ liệu

Để khôi phục dữ liệu sao lưu MongoDB's mongorestorelệnh được sử dụng. Lệnh này khôi phục tất cả dữ liệu từ thư mục sao lưu.

Cú pháp

Cú pháp cơ bản của mongorestore lệnh là -

>mongorestore

Sau đây là đầu ra của lệnh:

Khi bạn đang chuẩn bị triển khai MongoDB, bạn nên cố gắng hiểu cách ứng dụng của bạn sẽ được duy trì trong quá trình sản xuất. Bạn nên phát triển một cách tiếp cận nhất quán, có thể lặp lại để quản lý môi trường triển khai để bạn có thể giảm thiểu bất kỳ sự ngạc nhiên nào khi bạn đang trong quá trình sản xuất.

Phương pháp tốt nhất kết hợp việc tạo mẫu thiết lập của bạn, tiến hành kiểm tra tải, theo dõi các chỉ số chính và sử dụng thông tin đó để mở rộng quy mô thiết lập của bạn. Phần quan trọng của phương pháp này là chủ động giám sát toàn bộ hệ thống của bạn - điều này sẽ giúp bạn hiểu hệ thống sản xuất của mình sẽ hoạt động như thế nào trước khi triển khai và xác định nơi bạn sẽ cần bổ sung năng lực. Ví dụ, có cái nhìn sâu sắc về mức tăng đột biến tiềm năng trong việc sử dụng bộ nhớ của bạn có thể giúp dập tắt lửa khóa ghi trước khi nó bắt đầu.

Để giám sát việc triển khai của bạn, MongoDB cung cấp một số lệnh sau:

mongostat

Lệnh này kiểm tra trạng thái của tất cả các cá thể mongod đang chạy và bộ đếm trả về các hoạt động của cơ sở dữ liệu. Các bộ đếm này bao gồm chèn, truy vấn, cập nhật, xóa và con trỏ. Lệnh cũng hiển thị khi bạn gặp lỗi trang và hiển thị phần trăm khóa của bạn. Điều này có nghĩa là bạn sắp hết bộ nhớ, đạt dung lượng ghi hoặc có một số vấn đề về hiệu suất.

Để chạy lệnh, hãy bắt đầu phiên bản mongod của bạn. Trong một dấu nhắc lệnh khác, đi tớibin thư mục cài đặt mongodb của bạn và loại mongostat.

D:\set up\mongodb\bin>mongostat

Sau đây là đầu ra của lệnh:

mongotop

Lệnh này theo dõi và báo cáo hoạt động đọc và ghi của cá thể MongoDB trên cơ sở thu thập. Theo mặc định,mongotoptrả về thông tin trong mỗi giây, bạn có thể thay đổi nó cho phù hợp. Bạn nên kiểm tra xem hoạt động đọc và ghi này có phù hợp với ý định ứng dụng của bạn hay không và bạn không kích hoạt quá nhiều lần ghi vào cơ sở dữ liệu cùng một lúc, đọc quá thường xuyên từ đĩa hoặc vượt quá kích thước bộ làm việc của bạn.

Để chạy lệnh, hãy bắt đầu phiên bản mongod của bạn. Trong một dấu nhắc lệnh khác, đi tớibin thư mục cài đặt mongodb của bạn và loại mongotop.

D:\set up\mongodb\bin>mongotop

Sau đây là đầu ra của lệnh:

Thay đổi mongotop lệnh trả về thông tin ít thường xuyên hơn, chỉ định một số cụ thể sau lệnh mongotop.

D:\set up\mongodb\bin>mongotop 30

Ví dụ trên sẽ trả về giá trị sau mỗi 30 giây.

Ngoài các công cụ MongoDB, 10gen cung cấp dịch vụ giám sát được lưu trữ miễn phí, Dịch vụ quản lý MongoDB (MMS), cung cấp bảng điều khiển và cung cấp cho bạn chế độ xem các chỉ số từ toàn bộ cụm của bạn.

Trong chương này, chúng ta sẽ học cách thiết lập trình điều khiển MongoDB JDBC.

Cài đặt

Trước khi bắt đầu sử dụng MongoDB trong các chương trình Java của mình, bạn cần đảm bảo rằng bạn đã thiết lập trình điều khiển MongoDB JDBC và Java trên máy. Bạn có thể xem hướng dẫn Java để cài đặt Java trên máy của mình. Bây giờ, chúng ta hãy kiểm tra cách thiết lập trình điều khiển MongoDB JDBC.

  • Bạn cần tải jar từ đường dẫn Download mongo.jar . Đảm bảo tải xuống phiên bản mới nhất của nó.

  • Bạn cần đưa mongo.jar vào đường dẫn classpath của mình.

Kết nối với Cơ sở dữ liệu

Để kết nối cơ sở dữ liệu, bạn cần chỉ định tên cơ sở dữ liệu, nếu cơ sở dữ liệu không tồn tại thì MongoDB sẽ tự động tạo nó.

Sau đây là đoạn mã để kết nối với cơ sở dữ liệu -

import com.mongodb.client.MongoDatabase; 
import com.mongodb.MongoClient; 
import com.mongodb.MongoCredential;  

public class ConnectToDB { 
   
   public static void main( String args[] ) {  
      
      // Creating a Mongo client 
      MongoClient mongo = new MongoClient( "localhost" , 27017 ); 
   
      // Creating Credentials 
      MongoCredential credential; 
      credential = MongoCredential.createCredential("sampleUser", "myDb", 
         "password".toCharArray()); 
      System.out.println("Connected to the database successfully");  
      
      // Accessing the database 
      MongoDatabase database = mongo.getDatabase("myDb"); 
      System.out.println("Credentials ::"+ credential);     
   } 
}

Bây giờ, hãy biên dịch và chạy chương trình trên để tạo cơ sở dữ liệu myDb của chúng ta như hình dưới đây.

$javac ConnectToDB.java 
$java ConnectToDB

Khi thực thi, chương trình trên cung cấp cho bạn kết quả sau.

Connected to the database successfully 
Credentials ::MongoCredential{
   mechanism = null, 
   userName = 'sampleUser', 
   source = 'myDb', 
   password = <hidden>, 
   mechanismProperties = {}
}

Tạo bộ sưu tập

Để tạo một bộ sưu tập, createCollection() phương pháp của com.mongodb.client.MongoDatabase lớp được sử dụng.

Sau đây là đoạn mã để tạo một bộ sưu tập -

import com.mongodb.client.MongoDatabase; 
import com.mongodb.MongoClient; 
import com.mongodb.MongoCredential;  

public class CreatingCollection { 
   
   public static void main( String args[] ) {  
      
      // Creating a Mongo client 
      MongoClient mongo = new MongoClient( "localhost" , 27017 ); 
     
      // Creating Credentials 
      MongoCredential credential; 
      credential = MongoCredential.createCredential("sampleUser", "myDb", 
         "password".toCharArray()); 
      System.out.println("Connected to the database successfully");  
      
      //Accessing the database 
      MongoDatabase database = mongo.getDatabase("myDb");  
      
      //Creating a collection 
      database.createCollection("sampleCollection"); 
      System.out.println("Collection created successfully"); 
   } 
}

Khi biên dịch, chương trình trên cho bạn kết quả sau:

Connected to the database successfully 
Collection created successfully

Lấy / Chọn Bộ sưu tập

Để lấy / chọn một bộ sưu tập từ cơ sở dữ liệu, getCollection() phương pháp của com.mongodb.client.MongoDatabase lớp được sử dụng.

Sau đây là chương trình lấy / chọn bộ sưu tập -

import com.mongodb.client.MongoCollection; 
import com.mongodb.client.MongoDatabase; 

import org.bson.Document; 
import com.mongodb.MongoClient; 
import com.mongodb.MongoCredential;  

public class selectingCollection { 
   
   public static void main( String args[] ) {  
      
      // Creating a Mongo client 
      MongoClient mongo = new MongoClient( "localhost" , 27017 ); 
     
      // Creating Credentials 
      MongoCredential credential; 
      credential = MongoCredential.createCredential("sampleUser", "myDb", 
         "password".toCharArray()); 
      System.out.println("Connected to the database successfully");  
      
      // Accessing the database 
      MongoDatabase database = mongo.getDatabase("myDb");  
      
      // Creating a collection 
      System.out.println("Collection created successfully"); 

      // Retieving a collection
      MongoCollection<Document> collection = database.getCollection("myCollection"); 
      System.out.println("Collection myCollection selected successfully"); 
   }
}

Khi biên dịch, chương trình trên cho bạn kết quả sau:

Connected to the database successfully 
Collection created successfully 
Collection myCollection selected successfully

Chèn tài liệu

Để chèn một tài liệu vào MongoDB, insert() phương pháp của com.mongodb.client.MongoCollection lớp được sử dụng.

Sau đây là đoạn mã để chèn một tài liệu -

import com.mongodb.client.MongoCollection; 
import com.mongodb.client.MongoDatabase; 

import org.bson.Document;  
import com.mongodb.MongoClient; 
import com.mongodb.MongoCredential;  

public class InsertingDocument { 
   
   public static void main( String args[] ) {  
      
      // Creating a Mongo client 
      MongoClient mongo = new MongoClient( "localhost" , 27017 ); 

      // Creating Credentials 
      MongoCredential credential; 
      credential = MongoCredential.createCredential("sampleUser", "myDb", 
         "password".toCharArray()); 
      System.out.println("Connected to the database successfully");  
      
      // Accessing the database 
      MongoDatabase database = mongo.getDatabase("myDb"); 

      // Retrieving a collection
      MongoCollection<Document> collection = database.getCollection("sampleCollection"); 
      System.out.println("Collection sampleCollection selected successfully");

      Document document = new Document("title", "MongoDB") 
      .append("id", 1)
      .append("description", "database") 
      .append("likes", 100) 
      .append("url", "http://www.tutorialspoint.com/mongodb/") 
      .append("by", "tutorials point");  
      collection.insertOne(document); 
      System.out.println("Document inserted successfully");     
   } 
}

Khi biên dịch, chương trình trên cho bạn kết quả sau:

Connected to the database successfully 
Collection sampleCollection selected successfully 
Document inserted successfully

Lấy tất cả tài liệu

Để chọn tất cả tài liệu từ bộ sưu tập, find() phương pháp của com.mongodb.client.MongoCollectionlớp được sử dụng. Phương thức này trả về một con trỏ, vì vậy bạn cần phải lặp lại con trỏ này.

Sau đây là chương trình để chọn tất cả các tài liệu -

import com.mongodb.client.FindIterable; 
import com.mongodb.client.MongoCollection; 
import com.mongodb.client.MongoDatabase;  

import java.util.Iterator; 
import org.bson.Document; 
import com.mongodb.MongoClient; 
import com.mongodb.MongoCredential;  

public class RetrievingAllDocuments { 
   
   public static void main( String args[] ) {  
      
      // Creating a Mongo client 
      MongoClient mongo = new MongoClient( "localhost" , 27017 ); 

      // Creating Credentials 
      MongoCredential credential;
      credential = MongoCredential.createCredential("sampleUser", "myDb", 
         "password".toCharArray()); 
      System.out.println("Connected to the database successfully");  
      
      // Accessing the database 
      MongoDatabase database = mongo.getDatabase("myDb");  
      
      // Retrieving a collection 
      MongoCollection<Document> collection = database.getCollection("sampleCollection");
      System.out.println("Collection sampleCollection selected successfully"); 

      // Getting the iterable object 
      FindIterable<Document> iterDoc = collection.find(); 
      int i = 1; 

      // Getting the iterator 
      Iterator it = iterDoc.iterator(); 
    
      while (it.hasNext()) {  
         System.out.println(it.next());  
      i++; 
      }
   } 
}

Khi biên dịch, chương trình trên cho bạn kết quả sau:

Document{{
   _id = 5967745223993a32646baab8, 
   title = MongoDB, 
   id = 1, 
   description = database, 
   likes = 100, 
   url = http://www.tutorialspoint.com/mongodb/, by = tutorials point
}}  
Document{{
   _id = 7452239959673a32646baab8, 
   title = RethinkDB, 
   id = 2, 
   description = database, 
   likes = 200, 
   url = http://www.tutorialspoint.com/rethinkdb/, by = tutorials point
}}

Cập nhật tài liệu

Để cập nhật một tài liệu từ bộ sưu tập, updateOne() phương pháp của com.mongodb.client.MongoCollection lớp được sử dụng.

Sau đây là chương trình để chọn tài liệu đầu tiên -

import com.mongodb.client.FindIterable; 
import com.mongodb.client.MongoCollection; 
import com.mongodb.client.MongoDatabase; 
import com.mongodb.client.model.Filters; 
import com.mongodb.client.model.Updates; 

import java.util.Iterator; 
import org.bson.Document;  
import com.mongodb.MongoClient; 
import com.mongodb.MongoCredential;  

public class UpdatingDocuments { 
   
   public static void main( String args[] ) {  
      
      // Creating a Mongo client 
      MongoClient mongo = new MongoClient( "localhost" , 27017 ); 
     
      // Creating Credentials 
      MongoCredential credential; 
      credential = MongoCredential.createCredential("sampleUser", "myDb", 
         "password".toCharArray()); 
      System.out.println("Connected to the database successfully");  
      
      // Accessing the database 
      MongoDatabase database = mongo.getDatabase("myDb"); 

      // Retrieving a collection 
      MongoCollection<Document> collection = database.getCollection("sampleCollection");
      System.out.println("Collection myCollection selected successfully"); 

      collection.updateOne(Filters.eq("id", 1), Updates.set("likes", 150));       
      System.out.println("Document update successfully...");  
      
      // Retrieving the documents after updation 
      // Getting the iterable object
      FindIterable<Document> iterDoc = collection.find(); 
      int i = 1; 

      // Getting the iterator 
      Iterator it = iterDoc.iterator(); 

      while (it.hasNext()) {  
         System.out.println(it.next());  
         i++; 
      }     
   }  
}

Khi biên dịch, chương trình trên cho bạn kết quả sau:

Document update successfully... 
Document {{
   _id = 5967745223993a32646baab8, 
   title = MongoDB, 
   id = 1, 
   description = database, 
   likes = 150, 
   url = http://www.tutorialspoint.com/mongodb/, by = tutorials point
}}

Xóa tài liệu

Để xóa một tài liệu khỏi bộ sưu tập, bạn cần sử dụng deleteOne() phương pháp của com.mongodb.client.MongoCollection lớp học.

Sau đây là chương trình để xóa một tài liệu -

import com.mongodb.client.FindIterable; 
import com.mongodb.client.MongoCollection; 
import com.mongodb.client.MongoDatabase; 
import com.mongodb.client.model.Filters;  

import java.util.Iterator; 
import org.bson.Document; 
import com.mongodb.MongoClient; 
import com.mongodb.MongoCredential;  

public class DeletingDocuments { 
   
   public static void main( String args[] ) {  
   
      // Creating a Mongo client 
      MongoClient mongo = new MongoClient( "localhost" , 27017 );
      
      // Creating Credentials 
      MongoCredential credential; 
      credential = MongoCredential.createCredential("sampleUser", "myDb", 
         "password".toCharArray()); 
      System.out.println("Connected to the database successfully");  
      
      // Accessing the database 
      MongoDatabase database = mongo.getDatabase("myDb"); 

      // Retrieving a collection
      MongoCollection<Document> collection = database.getCollection("sampleCollection");
      System.out.println("Collection sampleCollection selected successfully"); 

      // Deleting the documents 
      collection.deleteOne(Filters.eq("id", 1)); 
      System.out.println("Document deleted successfully...");  
      
      // Retrieving the documents after updation 
      // Getting the iterable object 
      FindIterable<Document> iterDoc = collection.find(); 
      int i = 1; 

      // Getting the iterator 
      Iterator it = iterDoc.iterator(); 

      while (it.hasNext()) {  
         System.out.println("Inserted Document: "+i);  
         System.out.println(it.next());  
         i++; 
      }       
   } 
}

Khi biên dịch, chương trình trên cho bạn kết quả sau:

Connected to the database successfully 
Collection sampleCollection selected successfully 
Document deleted successfully...

Bỏ bộ sưu tập

Để loại bỏ một bộ sưu tập khỏi cơ sở dữ liệu, bạn cần sử dụng drop() phương pháp của com.mongodb.client.MongoCollection lớp học.

Sau đây là chương trình để xóa một bộ sưu tập -

import com.mongodb.client.MongoCollection; 
import com.mongodb.client.MongoDatabase;  

import org.bson.Document;  
import com.mongodb.MongoClient; 
import com.mongodb.MongoCredential;  

public class DropingCollection { 
   
   public static void main( String args[] ) {  

      // Creating a Mongo client 
      MongoClient mongo = new MongoClient( "localhost" , 27017 ); 

      // Creating Credentials 
      MongoCredential credential; 
      credential = MongoCredential.createCredential("sampleUser", "myDb", 
         "password".toCharArray()); 
      System.out.println("Connected to the database successfully");  
      
      // Accessing the database 
      MongoDatabase database = mongo.getDatabase("myDb");  
      
      // Creating a collection 
      System.out.println("Collections created successfully"); 

      // Retieving a collection
      MongoCollection<Document> collection = database.getCollection("sampleCollection");

      // Dropping a Collection 
      collection.drop(); 
      System.out.println("Collection dropped successfully");
   } 
}

Khi biên dịch, chương trình trên cho bạn kết quả sau:

Connected to the database successfully 
Collection sampleCollection selected successfully 
Collection dropped successfully

Liệt kê tất cả các bộ sưu tập

Để liệt kê tất cả các bộ sưu tập trong cơ sở dữ liệu, bạn cần sử dụng listCollectionNames() phương pháp của com.mongodb.client.MongoDatabase lớp học.

Sau đây là chương trình để liệt kê tất cả các bộ sưu tập của một cơ sở dữ liệu:

import com.mongodb.client.MongoDatabase; 
import com.mongodb.MongoClient; 
import com.mongodb.MongoCredential;  

public class ListOfCollection { 
   
   public static void main( String args[] ) {  
      
      // Creating a Mongo client 
      MongoClient mongo = new MongoClient( "localhost" , 27017 ); 

      // Creating Credentials 
      MongoCredential credential; 
      credential = MongoCredential.createCredential("sampleUser", "myDb", 
         "password".toCharArray()); 

      System.out.println("Connected to the database successfully");  
      
      // Accessing the database 
      MongoDatabase database = mongo.getDatabase("myDb"); 
      System.out.println("Collection created successfully"); 
      for (String name : database.listCollectionNames()) { 
         System.out.println(name); 
      } 
   }
}

Khi biên dịch, chương trình trên cho bạn kết quả sau:

Connected to the database successfully 
Collection created successfully 
myCollection 
myCollection1 
myCollection5

Các phương thức MongoDB còn lại save(), limit(), skip(), sort() vv hoạt động giống như được giải thích trong hướng dẫn tiếp theo.

Để sử dụng MongoDB với PHP, bạn cần sử dụng trình điều khiển MongoDB PHP. Tải xuống trình điều khiển từ url Tải xuống Trình điều khiển PHP . Đảm bảo tải xuống phiên bản mới nhất của nó. Bây giờ giải nén tệp lưu trữ và đặt php_mongo.dll vào thư mục mở rộng PHP của bạn ("ext" theo mặc định) và thêm dòng sau vào tệp php.ini của bạn -

extension = php_mongo.dll

Tạo kết nối và chọn cơ sở dữ liệu

Để tạo kết nối, bạn cần chỉ định tên cơ sở dữ liệu, nếu cơ sở dữ liệu không tồn tại thì MongoDB sẽ tự động tạo nó.

Sau đây là đoạn mã để kết nối với cơ sở dữ liệu -

<?php
   // connect to mongodb
   $m = new MongoClient();
	
   echo "Connection to database successfully";
   // select a database
   $db = $m->mydb;
	
   echo "Database mydb selected";
?>

Khi chương trình được thực thi, nó sẽ tạo ra kết quả sau:

Connection to database successfully
Database mydb selected

Tạo bộ sưu tập

Sau đây là đoạn mã để tạo một bộ sưu tập -

<?php
   // connect to mongodb
   $m = new MongoClient(); echo "Connection to database successfully"; // select a database $db = $m->mydb; echo "Database mydb selected"; $collection = $db->createCollection("mycol");
   echo "Collection created succsessfully";
?>

Khi chương trình được thực thi, nó sẽ tạo ra kết quả sau:

Connection to database successfully
Database mydb selected
Collection created succsessfully

Chèn tài liệu

Để chèn một tài liệu vào MongoDB, insert() phương pháp được sử dụng.

Sau đây là đoạn mã để chèn một tài liệu -

<?php
   // connect to mongodb
   $m = new MongoClient();
   echo "Connection to database successfully";
	
   // select a database
   $db = $m->mydb;
   echo "Database mydb selected";
   $collection = $db->mycol;
   echo "Collection selected succsessfully";
	
   $document = array( "title" => "MongoDB", "description" => "database", "likes" => 100, "url" => "http://www.tutorialspoint.com/mongodb/", "by" => "tutorials point" ); $collection->insert($document);
   echo "Document inserted successfully";
?>

Khi chương trình được thực thi, nó sẽ tạo ra kết quả sau:

Connection to database successfully
Database mydb selected
Collection selected succsessfully
Document inserted successfully

Tìm tất cả tài liệu

Để chọn tất cả các tài liệu từ bộ sưu tập, phương thức find () được sử dụng.

Sau đây là đoạn mã để chọn tất cả các tài liệu -

<?php
   // connect to mongodb
   $m = new MongoClient();
   echo "Connection to database successfully";
	
   // select a database
   $db = $m->mydb;
   echo "Database mydb selected";
   $collection = $db->mycol;
   echo "Collection selected succsessfully";

   $cursor = $collection->find();
   // iterate cursor to display title of documents
	
   foreach ($cursor as $document) {
      echo $document["title"] . "\n";
   }
?>

Khi chương trình được thực thi, nó sẽ tạo ra kết quả sau:

Connection to database successfully
Database mydb selected
Collection selected succsessfully {
   "title": "MongoDB"
}

Cập nhật tài liệu

Để cập nhật tài liệu, bạn cần sử dụng phương thức update ().

Trong ví dụ sau, chúng tôi sẽ cập nhật tiêu đề của tài liệu được chèn vào MongoDB Tutorial. Sau đây là đoạn mã để cập nhật một tài liệu -

<?php
   // connect to mongodb
   $m = new MongoClient();
   echo "Connection to database successfully";
	
   // select a database
   $db = $m->mydb;
   echo "Database mydb selected";
   $collection = $db->mycol;
   echo "Collection selected succsessfully";

   // now update the document
   $collection->update(array("title"=>"MongoDB"), array('$set'=>array("title"=>"MongoDB Tutorial")));
   echo "Document updated successfully";
	
   // now display the updated document
   $cursor = $collection->find();
	
   // iterate cursor to display title of documents
   echo "Updated document";
	
   foreach ($cursor as $document) {
      echo $document["title"] . "\n";
   }
?>

Khi chương trình được thực thi, nó sẽ tạo ra kết quả sau:

Connection to database successfully
Database mydb selected
Collection selected succsessfully
Document updated successfully
Updated document {
   "title": "MongoDB Tutorial"
}

Xóa tài liệu

Để xóa tài liệu, bạn cần sử dụng phương thức remove ().

Trong ví dụ sau, chúng tôi sẽ xóa các tài liệu có tiêu đề MongoDB Tutorial. Sau đây là đoạn mã để xóa một tài liệu -

<?php
   // connect to mongodb
   $m = new MongoClient();
   echo "Connection to database successfully";
	
   // select a database
   $db = $m->mydb;
   echo "Database mydb selected";
   $collection = $db->mycol;
   echo "Collection selected succsessfully";
   
   // now remove the document
   $collection->remove(array("title"=>"MongoDB Tutorial"),false); echo "Documents deleted successfully"; // now display the available documents $cursor = $collection->find(); // iterate cursor to display title of documents echo "Updated document"; foreach ($cursor as $document) { echo $document["title"] . "\n";
   }
?>

Khi chương trình được thực thi, nó sẽ tạo ra kết quả sau:

Connection to database successfully
Database mydb selected
Collection selected succsessfully
Documents deleted successfully

Trong ví dụ trên, tham số thứ hai là kiểu boolean và được sử dụng cho justOne lĩnh vực remove() phương pháp.

Các phương thức MongoDB còn lại findOne(), save(), limit(), skip(), sort() vv hoạt động giống như giải thích ở trên.

Các mối quan hệ trong MongoDB thể hiện cách các tài liệu khác nhau có liên quan với nhau về mặt logic. Các mối quan hệ có thể được mô hình hóa thông quaEmbeddedReferencedcác phương pháp tiếp cận. Các mối quan hệ như vậy có thể là 1: 1, 1: N, N: 1 hoặc N: N.

Chúng ta hãy xem xét trường hợp lưu trữ địa chỉ cho người dùng. Vì vậy, một người dùng có thể có nhiều địa chỉ làm cho mối quan hệ 1: N này.

Sau đây là cấu trúc tài liệu mẫu của user tài liệu -

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "name": "Tom Hanks",
   "contact": "987654321",
   "dob": "01-01-1991"
}

Sau đây là cấu trúc tài liệu mẫu của address tài liệu -

{
   "_id":ObjectId("52ffc4a5d85242602e000000"),
   "building": "22 A, Indiana Apt",
   "pincode": 123456,
   "city": "Los Angeles",
   "state": "California"
}

Mô hình hóa các mối quan hệ được nhúng

Trong cách tiếp cận nhúng, chúng tôi sẽ nhúng tài liệu địa chỉ bên trong tài liệu người dùng.

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address": [
      {
         "building": "22 A, Indiana Apt",
         "pincode": 123456,
         "city": "Los Angeles",
         "state": "California"
      },
      {
         "building": "170 A, Acropolis Apt",
         "pincode": 456789,
         "city": "Chicago",
         "state": "Illinois"
      }
   ]
}

Cách tiếp cận này duy trì tất cả dữ liệu liên quan trong một tài liệu duy nhất, giúp dễ dàng truy xuất và bảo trì. Toàn bộ tài liệu có thể được truy xuất trong một truy vấn đơn lẻ, chẳng hạn như -

>db.users.findOne({"name":"Tom Benzamin"},{"address":1})

Lưu ý rằng trong truy vấn trên, dbusers là cơ sở dữ liệu và bộ sưu tập tương ứng.

Hạn chế là nếu tài liệu nhúng tiếp tục tăng quá nhiều về kích thước, nó có thể ảnh hưởng đến hiệu suất đọc / ghi.

Mô hình hóa các mối quan hệ được tham chiếu

Đây là cách tiếp cận thiết kế mối quan hệ bình thường hóa. Trong cách tiếp cận này, cả tài liệu người dùng và địa chỉ sẽ được duy trì riêng biệt nhưng tài liệu người dùng sẽ chứa một trường sẽ tham chiếu đến tài liệu địa chỉ củaid cánh đồng.

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address_ids": [
      ObjectId("52ffc4a5d85242602e000000"),
      ObjectId("52ffc4a5d85242602e000001")
   ]
}

Như được hiển thị ở trên, tài liệu người dùng chứa trường mảng address_idstrong đó chứa các ObjectIds của các địa chỉ tương ứng. Sử dụng các ObjectIds này, chúng tôi có thể truy vấn các tài liệu địa chỉ và lấy chi tiết địa chỉ từ đó. Với cách tiếp cận này, chúng tôi sẽ cần hai truy vấn: trước tiên để tìm nạpaddress_ids lĩnh vực từ user tài liệu và thứ hai để tìm nạp các địa chỉ này từ address bộ sưu tập.

>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})

Như đã thấy trong chương cuối về các mối quan hệ MongoDB, để triển khai cấu trúc cơ sở dữ liệu chuẩn hóa trong MongoDB, chúng ta sử dụng khái niệm Referenced Relationships Còn được gọi là Manual Referencestrong đó chúng tôi lưu trữ thủ công id của tài liệu được tham chiếu bên trong tài liệu khác. Tuy nhiên, trong trường hợp tài liệu chứa các tham chiếu từ các bộ sưu tập khác nhau, chúng ta có thể sử dụngMongoDB DBRefs.

DBRefs so với Tham chiếu thủ công

Như một tình huống ví dụ, trong đó chúng tôi sẽ sử dụng DBRefs thay vì tham chiếu thủ công, hãy xem xét cơ sở dữ liệu nơi chúng tôi đang lưu trữ các loại địa chỉ khác nhau (nhà riêng, văn phòng, gửi thư, v.v.) trong các bộ sưu tập khác nhau (địa chỉ_ nhà, địa chỉ_ văn phòng, địa chỉ_mailing, v.v.). Bây giờ, khi mộtusertài liệu của bộ sưu tập tham chiếu đến một địa chỉ, nó cũng cần chỉ định bộ sưu tập nào cần xem xét dựa trên loại địa chỉ. Trong các tình huống như vậy mà một tài liệu tham chiếu đến các tài liệu từ nhiều tập hợp, chúng ta nên sử dụng DBRefs.

Sử dụng DBRefs

Có ba trường trong DBRefs -

  • $ref - Trường này chỉ định bộ sưu tập tài liệu được tham chiếu

  • $id - Trường này chỉ định trường _id của tài liệu được tham chiếu

  • $db - Đây là trường tùy chọn và chứa tên của cơ sở dữ liệu chứa tài liệu được tham chiếu

Hãy xem xét một tài liệu người dùng mẫu có trường DBRef address như được hiển thị trong đoạn mã -

{
   "_id":ObjectId("53402597d852426020000002"),
   "address": {
   "$ref": "address_home", "$id": ObjectId("534009e4d852427820000002"),
   "$db": "tutorialspoint"},
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin"
}

Các address Trường DBRef ở đây chỉ định rằng tài liệu địa chỉ được tham chiếu nằm trong address_home bộ sưu tập dưới tutorialspoint cơ sở dữ liệu và có id là 534009e4d852427820000002.

Đoạn mã sau tự động tìm trong bộ sưu tập được chỉ định bởi $ref tham số (address_home trong trường hợp của chúng tôi) cho tài liệu có id như được chỉ định bởi $id tham số trong DBRef.

>var user = db.users.findOne({"name":"Tom Benzamin"})
>var dbRef = user.address
>db[dbRef.$ref].findOne({"_id":(dbRef.$id)})

Đoạn mã trên trả về tài liệu địa chỉ sau có trong address_home bộ sưu tập -

{
   "_id" : ObjectId("534009e4d852427820000002"),
   "building" : "22 A, Indiana Apt",
   "pincode" : 123456,
   "city" : "Los Angeles",
   "state" : "California"
}

Trong chương này, chúng ta sẽ tìm hiểu về các truy vấn được đề cập.

Truy vấn được bao phủ là gì?

Theo tài liệu MongoDB chính thức, một truy vấn được đề cập là một truy vấn trong đó -

  • Tất cả các trường trong truy vấn là một phần của chỉ mục.
  • Tất cả các trường được trả về trong truy vấn đều nằm trong cùng một chỉ mục.

Vì tất cả các trường hiện diện trong truy vấn là một phần của chỉ mục, MongoDB khớp với các điều kiện truy vấn và trả về kết quả bằng cách sử dụng cùng một chỉ mục mà không thực sự nhìn vào bên trong tài liệu. Vì các chỉ mục có trong RAM nên việc tìm nạp dữ liệu từ các chỉ mục nhanh hơn nhiều so với việc tìm nạp dữ liệu bằng cách quét tài liệu.

Sử dụng các truy vấn được bao phủ

Để kiểm tra các truy vấn được đề cập, hãy xem xét tài liệu sau trong users bộ sưu tập -

{
   "_id": ObjectId("53402597d852426020000002"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "gender": "M",
   "name": "Tom Benzamin",
   "user_name": "tombenzamin"
}

Trước tiên, chúng tôi sẽ tạo một chỉ mục kết hợp cho users bộ sưu tập trên các lĩnh vực genderuser_name bằng cách sử dụng truy vấn sau -

>db.users.ensureIndex({gender:1,user_name:1})

Bây giờ, chỉ mục này sẽ bao gồm truy vấn sau:

>db.users.find({gender:"M"},{user_name:1,_id:0})

Điều đó có nghĩa là đối với truy vấn trên, MongoDB sẽ không xem xét các tài liệu cơ sở dữ liệu. Thay vào đó, nó sẽ tìm nạp dữ liệu cần thiết từ dữ liệu được lập chỉ mục rất nhanh.

Vì chỉ mục của chúng tôi không bao gồm _id, chúng tôi đã loại trừ nó một cách rõ ràng khỏi tập kết quả truy vấn của mình, vì MongoDB theo mặc định trả về trường _id trong mọi truy vấn. Vì vậy, truy vấn sau sẽ không được bao gồm bên trong chỉ mục được tạo ở trên -

>db.users.find({gender:"M"},{user_name:1})

Cuối cùng, hãy nhớ rằng một chỉ mục không thể bao hàm một truy vấn nếu -

  • Bất kỳ trường nào được lập chỉ mục đều là một mảng
  • Bất kỳ trường nào được lập chỉ mục đều là tài liệu con

Phân tích các truy vấn là một khía cạnh rất quan trọng để đo lường mức độ hiệu quả của thiết kế lập chỉ mục và cơ sở dữ liệu. Chúng ta sẽ tìm hiểu về các$explain$hint truy vấn.

Sử dụng $ giải thích

Các $explaintoán tử cung cấp thông tin về truy vấn, các chỉ mục được sử dụng trong một truy vấn và các thống kê khác. Nó rất hữu ích khi phân tích mức độ tối ưu hóa các chỉ mục của bạn.

Trong chương trước, chúng tôi đã tạo một chỉ mục cho users bộ sưu tập trên các lĩnh vực genderuser_name bằng cách sử dụng truy vấn sau -

>db.users.ensureIndex({gender:1,user_name:1})

Bây giờ chúng tôi sẽ sử dụng $explain trên truy vấn sau -

>db.users.find({gender:"M"},{user_name:1,_id:0}).explain()

Truy vấn giải thích () ở trên trả về kết quả được phân tích sau:

{
   "cursor" : "BtreeCursor gender_1_user_name_1",
   "isMultiKey" : false,
   "n" : 1,
   "nscannedObjects" : 0,
   "nscanned" : 1,
   "nscannedObjectsAllPlans" : 0,
   "nscannedAllPlans" : 1,
   "scanAndOrder" : false,
   "indexOnly" : true,
   "nYields" : 0,
   "nChunkSkips" : 0,
   "millis" : 0,
   "indexBounds" : {
      "gender" : [
         [
            "M",
            "M"
         ]
      ],
      "user_name" : [
         [
            {
               "$minElement" : 1 }, { "$maxElement" : 1
            }
         ]
      ]
   }
}

Bây giờ chúng ta sẽ xem xét các trường trong tập kết quả này -

  • Giá trị thực của indexOnly chỉ ra rằng truy vấn này đã sử dụng lập chỉ mục.

  • Các cursortrường chỉ định loại con trỏ được sử dụng. Kiểu BTreeCursor chỉ ra rằng một chỉ mục đã được sử dụng và cũng cho biết tên của chỉ mục được sử dụng. BasicCursor cho biết rằng quá trình quét toàn bộ đã được thực hiện mà không sử dụng bất kỳ chỉ mục nào.

  • n cho biết số lượng tài liệu phù hợp được trả lại.

  • nscannedObjects cho biết tổng số tài liệu được quét.

  • nscanned cho biết tổng số tài liệu hoặc mục chỉ mục đã quét.

Sử dụng $ gợi ý

Các $hinttoán tử buộc trình tối ưu hóa truy vấn sử dụng chỉ mục được chỉ định để chạy truy vấn. Điều này đặc biệt hữu ích khi bạn muốn kiểm tra hiệu suất của một truy vấn với các chỉ mục khác nhau. Ví dụ: truy vấn sau chỉ định chỉ mục trên các trườnggenderuser_name được sử dụng cho truy vấn này -

>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})

Để phân tích truy vấn trên bằng cách sử dụng $ giải thích -

>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1}).explain()

Dữ liệu mô hình cho các hoạt động nguyên tử

Cách tiếp cận được đề xuất để duy trì tính nguyên tử là giữ tất cả thông tin liên quan, thường xuyên được cập nhật cùng nhau trong một tài liệu duy nhất bằng cách sử dụng embedded documents. Điều này sẽ đảm bảo rằng tất cả các bản cập nhật cho một tài liệu là nguyên tử.

Xem xét tài liệu sản phẩm sau:

{
   "_id":1,
   "product_name": "Samsung S3",
   "category": "mobiles",
   "product_total": 5,
   "product_available": 3,
   "product_bought_by": [
      {
         "customer": "john",
         "date": "7-Jan-2014"
      },
      {
         "customer": "mark",
         "date": "8-Jan-2014"
      }
   ]
}

Trong tài liệu này, chúng tôi đã nhúng thông tin của khách hàng mua sản phẩm vào product_bought_bycánh đồng. Bây giờ, bất cứ khi nào khách hàng mới mua sản phẩm, trước tiên chúng tôi sẽ kiểm tra xem sản phẩm có còn sử dụng được khôngproduct_availablecánh đồng. Nếu có sẵn, chúng tôi sẽ giảm giá trị của trường product_available cũng như chèn tài liệu nhúng của khách hàng mới vào trường product_bought_by. Chúng tôi sẽ sử dụngfindAndModify lệnh cho chức năng này vì nó tìm kiếm và cập nhật tài liệu trong cùng một lúc.

>db.products.findAndModify({ 
   query:{_id:2,product_available:{$gt:0}}, 
   update:{ 
      $inc:{product_available:-1}, $push:{product_bought_by:{customer:"rob",date:"9-Jan-2014"}} 
   }    
})

Cách tiếp cận của chúng tôi về tài liệu nhúng và sử dụng truy vấn findAndModify đảm bảo rằng thông tin mua sản phẩm chỉ được cập nhật nếu sản phẩm đó có sẵn. Và toàn bộ giao dịch này nằm trong cùng một truy vấn, là nguyên tử.

Ngược lại với điều này, hãy xem xét kịch bản trong đó chúng tôi có thể đã lưu giữ sản phẩm sẵn có và thông tin về người đã mua sản phẩm, một cách riêng biệt. Trong trường hợp này, trước tiên, chúng tôi sẽ kiểm tra xem sản phẩm có sẵn không bằng cách sử dụng truy vấn đầu tiên. Sau đó, trong truy vấn thứ hai chúng tôi sẽ cập nhật thông tin mua hàng. Tuy nhiên, có thể giữa hai lần thực hiện truy vấn này, một số người dùng khác đã mua sản phẩm và nó không còn nữa. Nếu không biết điều này, truy vấn thứ hai của chúng tôi sẽ cập nhật thông tin mua hàng dựa trên kết quả của truy vấn đầu tiên của chúng tôi. Điều này sẽ làm cho cơ sở dữ liệu không nhất quán vì chúng tôi đã bán một sản phẩm không có sẵn.

Hãy xem xét tài liệu sau đây của users bộ sưu tập -

{
   "address": {
      "city": "Los Angeles",
      "state": "California",
      "pincode": "123"
   },
   "tags": [
      "music",
      "cricket",
      "blogs"
   ],
   "name": "Tom Benzamin"
}

Tài liệu trên chứa một address sub-document và một tags array.

Lập chỉ mục các trường mảng

Giả sử chúng ta muốn tìm kiếm tài liệu của người dùng dựa trên các thẻ của người dùng. Đối với điều này, chúng tôi sẽ tạo một chỉ mục trên mảng thẻ trong bộ sưu tập.

Lần lượt tạo chỉ mục trên mảng sẽ tạo ra các mục nhập chỉ mục riêng biệt cho từng trường của nó. Vì vậy, trong trường hợp của chúng tôi khi chúng tôi tạo chỉ mục trên mảng thẻ, các chỉ mục riêng biệt sẽ được tạo cho các giá trị của nó là âm nhạc, cricket và blog.

Để tạo chỉ mục trên mảng thẻ, hãy sử dụng đoạn mã sau:

>db.users.ensureIndex({"tags":1})

Sau khi tạo chỉ mục, chúng ta có thể tìm kiếm trên trường thẻ của bộ sưu tập như thế này -

>db.users.find({tags:"cricket"})

Để xác minh rằng lập chỉ mục thích hợp được sử dụng, hãy sử dụng explain lệnh -

>db.users.find({tags:"cricket"}).explain()

Lệnh trên dẫn đến "con trỏ": "BtreeCursor tags_1" xác nhận rằng lập chỉ mục thích hợp được sử dụng.

Lập chỉ mục các trường tài liệu con

Giả sử rằng chúng ta muốn tìm kiếm tài liệu dựa trên các trường thành phố, tiểu bang và mã pin. Vì tất cả các trường này là một phần của trường tài liệu con địa chỉ, chúng tôi sẽ tạo một chỉ mục trên tất cả các trường của tài liệu con.

Để tạo chỉ mục trên tất cả ba trường của tài liệu con, hãy sử dụng mã sau:

>db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})

Khi chỉ mục được tạo, chúng tôi có thể tìm kiếm bất kỳ trường tài liệu con nào sử dụng chỉ mục này như sau:

>db.users.find({"address.city":"Los Angeles"})

Hãy nhớ rằng biểu thức truy vấn phải tuân theo thứ tự của chỉ mục được chỉ định. Vì vậy, chỉ mục được tạo ở trên sẽ hỗ trợ các truy vấn sau:

>db.users.find({"address.city":"Los Angeles","address.state":"California"})

Nó cũng sẽ hỗ trợ truy vấn sau:

>db.users.find({"address.city":"LosAngeles","address.state":"California",
   "address.pincode":"123"})

Trong chương này, chúng ta sẽ tìm hiểu về Giới hạn lập chỉ mục và các thành phần khác của nó.

Chi phí bổ sung

Mỗi chỉ mục chiếm một số không gian cũng như gây ra chi phí trên mỗi lần chèn, cập nhật và xóa. Vì vậy, nếu bạn hiếm khi sử dụng bộ sưu tập của mình cho các thao tác đọc, bạn không nên sử dụng các chỉ mục.

Sử dụng RAM

Vì các chỉ mục được lưu trữ trong RAM, bạn nên đảm bảo rằng tổng kích thước của chỉ mục không vượt quá giới hạn RAM. Nếu tổng kích thước tăng kích thước RAM, nó sẽ bắt đầu xóa một số chỉ mục, gây giảm hiệu suất.

Giới hạn truy vấn

Không thể sử dụng lập chỉ mục trong các truy vấn sử dụng -

  • Biểu thức chính quy hoặc toán tử phủ định như $nin, $không, v.v.
  • Các toán tử số học như $ mod, v.v.
  • mệnh đề $ where

Do đó, bạn nên kiểm tra việc sử dụng chỉ mục cho các truy vấn của mình.

Các giới hạn chính của chỉ mục

Bắt đầu từ phiên bản 2.6, MongoDB sẽ không tạo chỉ mục nếu giá trị của trường chỉ mục hiện có vượt quá giới hạn khóa chỉ mục.

Chèn tài liệu vượt quá giới hạn khóa của chỉ mục

MongoDB sẽ không chèn bất kỳ tài liệu nào vào bộ sưu tập được lập chỉ mục nếu giá trị trường được lập chỉ mục của tài liệu này vượt quá giới hạn khóa chỉ mục. Tương tự với các tiện ích mongorestore và mongoimport.

Phạm vi tối đa

  • Một bộ sưu tập không được có nhiều hơn 64 chỉ mục.
  • Độ dài của tên chỉ mục không được dài hơn 125 ký tự.
  • Một chỉ mục kết hợp có thể có tối đa 31 trường được lập chỉ mục.

Chúng tôi đã sử dụng Id đối tượng MongoDB trong tất cả các chương trước. Trong chương này, chúng ta sẽ hiểu cấu trúc của ObjectId.

An ObjectId là loại BSON 12 byte có cấu trúc sau:

  • 4 byte đầu tiên đại diện cho số giây kể từ kỷ nguyên unix
  • 3 byte tiếp theo là mã định danh máy
  • 2 byte tiếp theo bao gồm process id
  • 3 byte cuối cùng là giá trị bộ đếm ngẫu nhiên

MongoDB sử dụng ObjectIds làm giá trị mặc định của _idcủa mỗi tài liệu, được tạo trong khi tạo bất kỳ tài liệu nào. Sự kết hợp phức tạp của ObjectId làm cho tất cả các trường _id trở thành duy nhất.

Tạo ObjectId Mới

Để tạo một ObjectId mới, hãy sử dụng đoạn mã sau:

>newObjectId = ObjectId()

Câu lệnh trên trả về id được tạo duy nhất sau:

ObjectId("5349b4ddd2781d08c09890f3")

Thay vì MongoDB tạo ObjectId, bạn cũng có thể cung cấp một id 12 byte -

>myObjectId = ObjectId("5349b4ddd2781d08c09890f4")

Tạo Dấu thời gian của tài liệu

Vì ObjectId _id theo mặc định lưu trữ dấu thời gian 4 byte, trong hầu hết các trường hợp, bạn không cần lưu trữ thời gian tạo của bất kỳ tài liệu nào. Bạn có thể tìm nạp thời gian tạo tài liệu bằng phương thức getTimestamp -

>ObjectId("5349b4ddd2781d08c09890f4").getTimestamp()

Thao tác này sẽ trả về thời gian tạo tài liệu này ở định dạng ngày ISO -

ISODate("2014-04-12T21:49:17Z")

Chuyển đổi ObjectId thành Chuỗi

Trong một số trường hợp, bạn có thể cần giá trị của ObjectId ở định dạng chuỗi. Để chuyển đổi ObjectId trong chuỗi, hãy sử dụng mã sau:

>newObjectId.str

Đoạn mã trên sẽ trả về định dạng chuỗi của Hướng dẫn -

5349b4ddd2781d08c09890f3

Theo tài liệu MongoDB, Map-reducelà một mô hình xử lý dữ liệu để cô đọng khối lượng lớn dữ liệu thành các kết quả tổng hợp hữu ích. MongoDB sử dụngmapReducelệnh cho các hoạt động thu nhỏ bản đồ. MapReduce thường được sử dụng để xử lý các tập dữ liệu lớn.

Lệnh MapReduce

Sau đây là cú pháp của lệnh mapReduce cơ bản:

>db.collection.mapReduce(
   function() {emit(key,value);},  //map function
   function(key,values) {return reduceFunction}, {   //reduce function
      out: collection,
      query: document,
      sort: document,
      limit: number
   }
)

Trước tiên, hàm map-Reduce sẽ truy vấn bộ sưu tập, sau đó ánh xạ các tài liệu kết quả để tạo ra các cặp khóa-giá trị, sau đó được giảm bớt dựa trên các khóa có nhiều giá trị.

Trong cú pháp trên -

  • map là một hàm javascript ánh xạ một giá trị với một khóa và tạo ra một cặp khóa-giá trị

  • reduce là một hàm javascript giảm hoặc nhóm tất cả các tài liệu có cùng một khóa

  • out chỉ định vị trí của kết quả truy vấn thu nhỏ bản đồ

  • query chỉ định các tiêu chí lựa chọn tùy chọn để chọn tài liệu

  • sort chỉ định tiêu chí sắp xếp tùy chọn

  • limit chỉ định số lượng tài liệu tối đa tùy chọn sẽ được trả lại

Sử dụng MapReduce

Hãy xem xét cấu trúc tài liệu sau đây lưu trữ các bài đăng của người dùng. Tài liệu lưu trữ user_name của người dùng và trạng thái của bài đăng.

{
   "post_text": "tutorialspoint is an awesome website for tutorials",
   "user_name": "mark",
   "status":"active"
}

Bây giờ, chúng ta sẽ sử dụng hàm mapReduce trên posts bộ sưu tập để chọn tất cả các bài đăng đang hoạt động, nhóm chúng trên cơ sở user_name và sau đó đếm số lượng bài đăng của mỗi người dùng bằng cách sử dụng mã sau:

>db.posts.mapReduce( 
   function() { emit(this.user_id,1); }, 
	
   function(key, values) {return Array.sum(values)}, {  
      query:{status:"active"},  
      out:"post_total" 
   }
)

Truy vấn mapReduce ở trên xuất ra kết quả sau:

{
   "result" : "post_total",
   "timeMillis" : 9,
   "counts" : {
      "input" : 4,
      "emit" : 4,
      "reduce" : 2,
      "output" : 2
   },
   "ok" : 1,
}

Kết quả cho thấy có tổng cộng 4 tài liệu phù hợp với truy vấn (trạng thái: "hoạt động"), hàm bản đồ phát ra 4 tài liệu có cặp khóa-giá trị và cuối cùng là hàm rút gọn các tài liệu được ánh xạ nhóm có cùng khóa thành 2.

Để xem kết quả của truy vấn mapReduce này, hãy sử dụng toán tử find -

>db.posts.mapReduce( 
   function() { emit(this.user_id,1); }, 
   function(key, values) {return Array.sum(values)}, {  
      query:{status:"active"},  
      out:"post_total" 
   }
	
).find()

Truy vấn trên cho kết quả sau cho biết rằng cả hai người dùng tommark có hai bài đăng ở trạng thái hoạt động -

{ "_id" : "tom", "value" : 2 }
{ "_id" : "mark", "value" : 2 }

Theo cách tương tự, các truy vấn MapReduce có thể được sử dụng để xây dựng các truy vấn tổng hợp phức tạp lớn. Việc sử dụng các hàm Javascript tùy chỉnh làm cho việc sử dụng MapReduce rất linh hoạt và mạnh mẽ.

Bắt đầu từ phiên bản 2.4, MongoDB bắt đầu hỗ trợ các chỉ mục văn bản để tìm kiếm bên trong nội dung chuỗi. CácText Search sử dụng kỹ thuật cắt gốc để tìm kiếm các từ được chỉ định trong các trường chuỗi bằng cách bỏ các từ dừng gốc như a, an, the, vv Hiện tại, MongoDB hỗ trợ khoảng 15 ngôn ngữ.

Bật tìm kiếm văn bản

Ban đầu, Tìm kiếm Văn bản là một tính năng thử nghiệm nhưng bắt đầu từ phiên bản 2.6, cấu hình được bật theo mặc định. Nhưng nếu bạn đang sử dụng phiên bản trước của MongoDB, bạn phải bật tìm kiếm văn bản với mã sau:

>db.adminCommand({setParameter:true,textSearchEnabled:true})

Tạo chỉ mục văn bản

Xem xét tài liệu sau dưới posts bộ sưu tập chứa văn bản bài đăng và các thẻ của nó -

{
   "post_text": "enjoy the mongodb articles on tutorialspoint",
   "tags": [
      "mongodb",
      "tutorialspoint"
   ]
}

Chúng tôi sẽ tạo một chỉ mục văn bản trên trường post_text để chúng tôi có thể tìm kiếm bên trong văn bản bài đăng của mình -

>db.posts.ensureIndex({post_text:"text"})

Sử dụng Chỉ mục Văn bản

Bây giờ chúng tôi đã tạo chỉ mục văn bản trên trường post_text, chúng tôi sẽ tìm kiếm tất cả các bài đăng có từ tutorialspoint trong văn bản của họ.

>db.posts.find({$text:{$search:"tutorialspoint"}})

Lệnh trên trả về các tài liệu kết quả sau có từ tutorialspoint trong văn bản bài đăng của họ -

{ 
   "_id" : ObjectId("53493d14d852429c10000002"), 
   "post_text" : "enjoy the mongodb articles on tutorialspoint", 
   "tags" : [ "mongodb", "tutorialspoint" ]
}
{
   "_id" : ObjectId("53493d1fd852429c10000003"), 
   "post_text" : "writing tutorials on mongodb",
   "tags" : [ "mongodb", "tutorial" ] 
}

Nếu bạn đang sử dụng các phiên bản MongoDB cũ, bạn phải sử dụng lệnh sau:

>db.posts.runCommand("text",{search:" tutorialspoint "})

Sử dụng Tìm kiếm văn bản cải thiện rất nhiều hiệu quả tìm kiếm so với tìm kiếm thông thường.

Xóa chỉ mục văn bản

Để xóa một chỉ mục văn bản hiện có, trước tiên hãy tìm tên của chỉ mục bằng cách sử dụng truy vấn sau:

>db.posts.getIndexes()

Sau khi nhận được tên chỉ mục của bạn từ truy vấn trên, hãy chạy lệnh sau. Đây,post_text_text là tên của chỉ mục.

>db.posts.dropIndex("post_text_text")

Biểu thức chính quy thường được sử dụng trong tất cả các ngôn ngữ để tìm kiếm một mẫu hoặc từ trong bất kỳ chuỗi nào. MongoDB cũng cung cấp chức năng của biểu thức chính quy để đối sánh mẫu chuỗi bằng cách sử dụng$regexnhà điều hành. MongoDB sử dụng PCRE (Biểu thức chính quy tương thích Perl) làm ngôn ngữ biểu thức chính quy.

Không giống như tìm kiếm văn bản, chúng ta không cần thực hiện bất kỳ cấu hình hoặc lệnh nào để sử dụng biểu thức chính quy.

Hãy xem xét cấu trúc tài liệu sau dưới posts bộ sưu tập chứa văn bản bài đăng và các thẻ của nó -

{
   "post_text": "enjoy the mongodb articles on tutorialspoint",
   "tags": [
      "mongodb",
      "tutorialspoint"
   ]
}

Sử dụng biểu thức regex

Truy vấn regex sau đây tìm kiếm tất cả các bài đăng có chứa chuỗi tutorialspoint trong đó -

>db.posts.find({post_text:{$regex:"tutorialspoint"}})

Truy vấn tương tự cũng có thể được viết dưới dạng:

>db.posts.find({post_text:/tutorialspoint/})

Sử dụng biểu thức regex với Phân biệt chữ hoa chữ thường

Để làm cho cụm từ tìm kiếm không phân biệt chữ hoa chữ thường, chúng tôi sử dụng $options tham số với giá trị $i. Lệnh sau sẽ tìm kiếm các chuỗi có từtutorialspoint, không phân biệt trường hợp nhỏ hơn hay vốn -

>db.posts.find({post_text:{$regex:"tutorialspoint",$options:"$i"}})

Một trong những kết quả trả về từ truy vấn này là tài liệu sau có chứa từ tutorialspoint trong các trường hợp khác nhau -

{
   "_id" : ObjectId("53493d37d852429c10000004"),
   "post_text" : "hey! this is my post on TutorialsPoint", 
   "tags" : [ "tutorialspoint" ]
}

Sử dụng regex cho các phần tử mảng

Chúng ta cũng có thể sử dụng khái niệm regex trên trường mảng. Điều này đặc biệt rất quan trọng khi chúng tôi triển khai chức năng của thẻ. Vì vậy, nếu bạn muốn tìm kiếm tất cả các bài đăng có thẻ bắt đầu từ hướng dẫn từ (hoặc hướng dẫn hoặc hướng dẫn hoặc điểm hướng dẫn hoặc hướng dẫnphp), bạn có thể sử dụng mã sau:

>db.posts.find({tags:{$regex:"tutorial"}})

Tối ưu hóa các Truy vấn Cụm từ Thông dụng

  • Nếu các trường tài liệu là indexed, truy vấn sẽ sử dụng việc sử dụng các giá trị được lập chỉ mục để khớp với biểu thức chính quy. Điều này làm cho việc tìm kiếm rất nhanh so với việc quét biểu thức chính quy trong toàn bộ bộ sưu tập.

  • Nếu biểu thức chính quy là một prefix expression, tất cả các kết quả phù hợp đều bắt đầu bằng một ký tự chuỗi nhất định. Ví dụ: nếu biểu thức regex là^tut, sau đó truy vấn chỉ phải tìm kiếm những chuỗi bắt đầu bằng tut.

RockMongo là một công cụ quản trị MongoDB mà bạn có thể quản lý máy chủ, cơ sở dữ liệu, bộ sưu tập, tài liệu, chỉ mục và nhiều hơn thế nữa. Nó cung cấp một cách rất thân thiện với người dùng để đọc, viết và tạo tài liệu. Nó tương tự như công cụ PHPMyAdmin cho PHP và MySQL.

Tải xuống RockMongo

Bạn có thể tải xuống phiên bản RockMongo mới nhất từ ​​đây: https://github.com/iwind/rockmongo

Cài đặt RockMongo

Sau khi tải xuống, bạn có thể giải nén gói trong thư mục gốc máy chủ của mình và đổi tên thư mục đã giải nén thành rockmongo. Mở bất kỳ trình duyệt web nào và truy cậpindex.phptrang từ thư mục rockmongo. Nhập admin / admin làm tên người dùng / mật khẩu tương ứng.

Làm việc với RockMongo

Bây giờ chúng ta sẽ xem xét một số thao tác cơ bản mà bạn có thể thực hiện với RockMongo.

Tạo cơ sở dữ liệu mới

Để tạo một cơ sở dữ liệu mới, hãy nhấp vào Databaseschuyển hướng. Nhấp chuộtCreate New Database. Trên màn hình tiếp theo, cung cấp tên của cơ sở dữ liệu mới và nhấp vàoCreate. Bạn sẽ thấy một cơ sở dữ liệu mới được thêm vào trong bảng điều khiển bên trái.

Tạo bộ sưu tập mới

Để tạo một bộ sưu tập mới bên trong cơ sở dữ liệu, hãy nhấp vào cơ sở dữ liệu đó từ bảng điều khiển bên trái. Bấm vàoNew Collectionliên kết trên đầu trang. Cung cấp tên yêu cầu của bộ sưu tập. Đừng lo lắng về các trường khác là Giới hạn, Kích thước và Tối đa. Bấm vàoCreate. Một bộ sưu tập mới sẽ được tạo và bạn sẽ có thể nhìn thấy nó trong bảng điều khiển bên trái.

Tạo tài liệu mới

Để tạo một tài liệu mới, hãy bấm vào bộ sưu tập mà bạn muốn thêm tài liệu. Khi bạn nhấp vào một bộ sưu tập, bạn sẽ có thể xem tất cả các tài liệu trong bộ sưu tập đó được liệt kê ở đó. Để tạo một tài liệu mới, hãy nhấp vàoInsertliên kết ở trên cùng. Bạn có thể nhập dữ liệu của tài liệu ở định dạng JSON hoặc mảng và nhấp vàoSave.

Xuất / Nhập dữ liệu

Để nhập / xuất dữ liệu của bất kỳ tập hợp nào, hãy nhấp vào tập hợp đó và sau đó nhấp vào Export/Importliên kết trên bảng điều khiển trên cùng. Làm theo hướng dẫn tiếp theo để xuất dữ liệu của bạn ở định dạng zip và sau đó nhập cùng một tệp zip để nhập lại dữ liệu.

GridFSlà đặc điểm kỹ thuật của MongoDB để lưu trữ và truy xuất các tệp lớn như hình ảnh, tệp âm thanh, tệp video, v.v. Nó là một loại hệ thống tệp để lưu trữ tệp nhưng dữ liệu của nó được lưu trữ trong các bộ sưu tập MongoDB. GridFS có khả năng lưu trữ các tệp lớn hơn giới hạn kích thước tài liệu là 16MB.

GridFS chia tệp thành nhiều phần và lưu trữ từng phần dữ liệu trong một tài liệu riêng biệt, mỗi tệp có kích thước tối đa 255k.

GridFS theo mặc định sử dụng hai bộ sưu tập fs.filesfs.chunksđể lưu trữ siêu dữ liệu của tệp và các phần. Mỗi đoạn được xác định bởi trường ObjectId _id duy nhất của nó. Các fs.files đóng vai trò là một tài liệu mẹ. Cácfiles_id trường trong tài liệu fs.chunks liên kết đoạn này với phần mẹ của nó.

Sau đây là tài liệu mẫu của bộ sưu tập fs.files -

{
   "filename": "test.txt",
   "chunkSize": NumberInt(261120),
   "uploadDate": ISODate("2014-04-13T11:32:33.557Z"),
   "md5": "7b762939321e146569b07f72c62cca4f",
   "length": NumberInt(646)
}

Tài liệu chỉ định tên tệp, kích thước đoạn, ngày tải lên và độ dài.

Sau đây là tài liệu mẫu của tài liệu fs.chunks -

{
   "files_id": ObjectId("534a75d19f54bfec8a2fe44b"),
   "n": NumberInt(0),
   "data": "Mongo Binary Data"
}

Thêm tệp vào GridFS

Bây giờ, chúng tôi sẽ lưu trữ một tệp mp3 bằng GridFS bằng cách sử dụng putchỉ huy. Đối với điều này, chúng tôi sẽ sử dụngmongofiles.exe tiện ích hiện diện trong thư mục bin của thư mục cài đặt MongoDB.

Mở dấu nhắc lệnh của bạn, điều hướng đến mongofiles.exe trong thư mục bin của thư mục cài đặt MongoDB và nhập mã sau:

>mongofiles.exe -d gridfs put song.mp3

Đây, gridfslà tên của cơ sở dữ liệu mà tệp sẽ được lưu trữ. Nếu cơ sở dữ liệu không có, MongoDB sẽ tự động tạo một tài liệu mới ngay lập tức. Song.mp3 là tên của tệp được tải lên. Để xem tài liệu của tệp trong cơ sở dữ liệu, bạn có thể sử dụng truy vấn tìm -

>db.fs.files.find()

Lệnh trên trả về tài liệu sau:

{
   _id: ObjectId('534a811bf8b4aa4d33fdf94d'), 
   filename: "song.mp3", 
   chunkSize: 261120, 
   uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41",
   length: 10401959 
}

Chúng tôi cũng có thể thấy tất cả các phần có trong bộ sưu tập fs.chunks liên quan đến tệp được lưu trữ với mã sau, sử dụng id tài liệu được trả về trong truy vấn trước đó -

>db.fs.chunks.find({files_id:ObjectId('534a811bf8b4aa4d33fdf94d')})

Trong trường hợp của tôi, truy vấn trả về 40 tài liệu có nghĩa là toàn bộ tài liệu mp3 được chia thành 40 phần dữ liệu.

Capped collectionslà các bộ sưu tập hình tròn có kích thước cố định tuân theo thứ tự chèn để hỗ trợ hiệu suất cao cho các hoạt động tạo, đọc và xóa. Theo vòng tròn, có nghĩa là khi kích thước cố định được phân bổ cho bộ sưu tập hết, nó sẽ bắt đầu xóa tài liệu cũ nhất trong bộ sưu tập mà không cung cấp bất kỳ lệnh rõ ràng nào.

Bộ sưu tập có giới hạn hạn chế cập nhật tài liệu nếu cập nhật dẫn đến kích thước tài liệu tăng lên. Vì bộ sưu tập có giới hạn lưu trữ tài liệu theo thứ tự của ổ lưu trữ, nó đảm bảo rằng kích thước tài liệu không làm tăng kích thước được phân bổ trên đĩa. Bộ sưu tập có giới hạn là tốt nhất để lưu trữ thông tin nhật ký, dữ liệu bộ nhớ cache hoặc bất kỳ dữ liệu khối lượng lớn nào khác.

Tạo bộ sưu tập có giới hạn

Để tạo một bộ sưu tập giới hạn, chúng tôi sử dụng lệnh createCollection bình thường nhưng với capped tùy chọn như true và chỉ định kích thước tối đa của bộ sưu tập tính bằng byte.

>db.createCollection("cappedLogCollection",{capped:true,size:10000})

Ngoài kích thước bộ sưu tập, chúng tôi cũng có thể giới hạn số lượng tài liệu trong bộ sưu tập bằng cách sử dụng max tham số -

>db.createCollection("cappedLogCollection",{capped:true,size:10000,max:1000})

Nếu bạn muốn kiểm tra xem một bộ sưu tập có bị giới hạn hay không, hãy sử dụng cách sau isCapped lệnh -

>db.cappedLogCollection.isCapped()

Nếu có một bộ sưu tập hiện tại mà bạn định chuyển đổi sang giới hạn, bạn có thể thực hiện điều đó bằng mã sau:

>db.runCommand({"convertToCapped":"posts",size:10000})

Mã này sẽ chuyển đổi bộ sưu tập hiện có của chúng tôi posts vào một bộ sưu tập giới hạn.

Truy vấn bộ sưu tập có giới hạn

Theo mặc định, một truy vấn tìm trên bộ sưu tập có giới hạn sẽ hiển thị kết quả theo thứ tự chèn. Nhưng nếu bạn muốn các tài liệu được truy xuất theo thứ tự ngược lại, hãy sử dụngsort lệnh như được hiển thị trong đoạn mã sau:

>db.cappedLogCollection.find().sort({$natural:-1})

Có một số điểm quan trọng khác về bộ sưu tập có giới hạn đáng biết -

  • Chúng tôi không thể xóa tài liệu khỏi bộ sưu tập có giới hạn.

  • Không có chỉ mục mặc định nào có trong bộ sưu tập giới hạn, thậm chí không có trên trường _id.

  • Trong khi chèn một tài liệu mới, MongoDB không thực sự phải tìm một nơi để chứa tài liệu mới trên đĩa. Nó có thể chèn một cách mù quáng tài liệu mới vào phần đuôi của bộ sưu tập. Điều này làm cho các hoạt động chèn trong bộ sưu tập giới hạn rất nhanh.

  • Tương tự, trong khi đọc tài liệu, MongoDB trả về các tài liệu theo thứ tự như hiện tại trên đĩa. Điều này làm cho hoạt động đọc rất nhanh.

MongoDB không có chức năng tự động tăng dần, giống như cơ sở dữ liệu SQL. Theo mặc định, nó sử dụng ObjectId 12 byte cho_idlàm khóa chính để xác định duy nhất các tài liệu. Tuy nhiên, có thể có những trường hợp mà chúng ta có thể muốn trường _id có một số giá trị tự động tăng lên khác với ObjectId.

Vì đây không phải là tính năng mặc định trong MongoDB, chúng tôi sẽ lập trình đạt được chức năng này bằng cách sử dụng counters bộ sưu tập theo gợi ý của tài liệu MongoDB.

Sử dụng Bộ sưu tập Bộ đếm

Hãy xem xét những điều sau productstài liệu. Chúng tôi muốn trường _id là mộtauto-incremented integer sequence bắt đầu từ 1,2,3,4 tối đa n.

{
  "_id":1,
  "product_name": "Apple iPhone",
  "category": "mobiles"
}

Đối với điều này, hãy tạo counters tập hợp, sẽ theo dõi giá trị trình tự cuối cùng cho tất cả các trường trình tự.

>db.createCollection("counters")

Bây giờ, chúng tôi sẽ chèn tài liệu sau vào bộ sưu tập bộ đếm với productid như chìa khóa của nó -

{
  "_id":"productid",
  "sequence_value": 0
}

Cánh đồng sequence_value theo dõi giá trị cuối cùng của dãy số.

Sử dụng mã sau để chèn tài liệu trình tự này vào bộ sưu tập bộ đếm -

>db.counters.insert({_id:"productid",sequence_value:0})

Tạo hàm Javascript

Bây giờ, chúng ta sẽ tạo một hàm getNextSequenceValuesẽ lấy tên chuỗi làm đầu vào của nó, tăng số thứ tự lên 1 và trả về số thứ tự đã cập nhật. Trong trường hợp của chúng tôi, tên chuỗi làproductid.

>function getNextSequenceValue(sequenceName){

   var sequenceDocument = db.counters.findAndModify({
      query:{_id: sequenceName },
      update: {$inc:{sequence_value:1}},
      new:true
   });
	
   return sequenceDocument.sequence_value;
}

Sử dụng hàm Javascript

Bây giờ chúng ta sẽ sử dụng hàm getNextSequenceValue trong khi tạo một tài liệu mới và gán giá trị trình tự trả về dưới dạng trường _id của tài liệu.

Chèn hai tài liệu mẫu bằng mã sau:

>db.products.insert({
   "_id":getNextSequenceValue("productid"),
   "product_name":"Apple iPhone",
   "category":"mobiles"
})

>db.products.insert({
   "_id":getNextSequenceValue("productid"),
   "product_name":"Samsung S3",
   "category":"mobiles"
})

Như bạn thấy, chúng ta đã sử dụng hàm getNextSequenceValue để đặt giá trị cho trường _id.

Để xác minh chức năng, hãy để chúng tôi tìm nạp tài liệu bằng lệnh find -

>db.products.find()

Truy vấn trên trả về các tài liệu sau có trường _id tăng dần -

{ "_id" : 1, "product_name" : "Apple iPhone", "category" : "mobiles"}

{ "_id" : 2, "product_name" : "Samsung S3", "category" : "mobiles" }