MongoDB - Cheatsheet
Cheatsheet tổng hợp các lệnh và truy vấn MongoDB phổ biến nhất được sử dụng thường xuyên.
🔖 Gợi ý từ Admin
📝 Tài liệu phỏng vấn kiến thức lập trình: Xem tại đây!!!
📌 Tìm hiểu về thuật toán: Xem tại đây!!!
📌 Roadmaps - Lộ trình trở thành một lập trình viên: Xem tại đây!!!
⚡️ Cheatsheet các ngôn ngữ lập trình: Xem tại đây!!!
⚡️ Handbook lập trình: Xem tại đây!!!
I. Tổng hợp MongoDB Cheatsheet
1. Cơ bản
⚡️ Kết nối MongoDB Shell
mongo
mongo --host <host> --port <port> -u <user> -p <pwd>
mongo "mongodb://192.168.1.1:27017"
mongo "mongodb+srv://cluster-name.abcde.mongodb.net/<dbname>" --username <username>
Giải thích:
mongo
: Dòng lệnh này được sử dụng để kết nối đến MongoDB Shell.--host <host>
: Xác định máy chủ nơi MongoDB đang chạy.--port <port>
: Chỉ định cổng kết nối tới MongoDB (mặc định là 27017).-u <user>
: Xác định tên người dùng để xác thực.-p <pwd>
: Xác định mật khẩu để xác thực. (Nếu bỏ qua, bạn sẽ nhận được một nhắc nhở để nhập mật khẩu.)"mongodb://192.168.1.1:27017"
: Kết nối đến một máy chủ MongoDB cụ thể với địa chỉ IP và cổng xác định."mongodb+srv://cluster-name.abcde.mongodb.net/<dbname>"
: Kết nối đến MongoDB Atlas, một dịch vụ quản lý cơ sở dữ liệu MongoDB.cluster-name
là tên của cluster, và<dbname>
là tên của cơ sở dữ liệu bạn muốn kết nối.--username <username>
: Xác định tên người dùng khi kết nối đến MongoDB Atlas.
⚡️ Các lệnh hỗ trợ
show dbs : # Hiển thị danh sách các cơ sở dữ liệu
db # In ra cơ sở dữ liệu hiện tại
use <database_name> # Chuyển đổi sang một cơ sở dữ liệu khác với tên `<database_name>`.
show collections # Hiển thị danh sách các bảng trong cơ sở dữ liệu hiện tại.
load("myScript.js") # Chạy một tập tin JavaScript trong MongoDB Shell. Điều này hữu ích khi bạn muốn thực hiện một loạt các lệnh từ một tập tin script.
2. CRUD
CRUD là viết tắt của "Create, Read, Update, Delete," và đây là các hoạt động cơ bản trong quản lý cơ sở dữ liệu. Trong MongoDB, thực hiện CRUD là khá trực tiếp và sử dụng JavaScript-like syntax trong MongoDB Shell. Dưới đây là ví dụ về các thao tác CRUD trong MongoDB:
⚡️ Create (Tạo): Thêm một bản ghi mới vào một bảng (collection)
db.users.insertOne({
name: 'John Doe',
age: 30,
email: '[email protected]',
});
⚡️ Read (Đọc): Truy vấn dữ liệu từ một bảng (collection)
db.users.find();
db.users.findOne({ name: 'John Doe' });
⚡️ Update (Cập nhật): Sửa đổi dữ liệu trong một bảng (collection)
db.users.updateOne({ name: 'John Doe' }, { $set: { age: 31 } });
db.users.updateMany({ age: { $gte: 30 } }, { $set: { status: 'adult' } });
⚡️ Delete (Xóa): Xóa bản ghi khỏi một bảng (collection)
db.users.deleteOne({ name: 'John Doe' });
db.users.deleteMany({ age: { $lt: 18 } });
⚡️ Mảng (Array)
Dưới đây là giải thích và dịch một số câu lệnh MongoDB liên quan đến thao tác với mảng:
// Thêm một phần tử mới vào mảng
db.coll.update({ _id: 1 }, { $push: { array: 1 } });
// Xóa một phần tử khỏi mảng
db.coll.update({ _id: 1 }, { $pull: { array: 1 } });
// Thêm một phần tử vào mảng nếu nó không tồn tại
db.coll.update({ _id: 1 }, { $addToSet: { array: 2 } });
// Xóa phần tử cuối cùng từ mảng
db.coll.update({ _id: 1 }, { $pop: { array: 1 } });
// Xóa phần tử đầu tiên từ mảng
db.coll.update({ _id: 1 }, { $pop: { array: -1 } });
// Xóa nhiều phần tử từ mảng
db.coll.update({ _id: 1 }, { $pullAll: { array: [3, 4, 5] } });
// Thêm nhiều phần tử vào mảng
db.coll.update({ _id: 1 }, { $push: { scores: { $each: [90, 92, 85] } } });
// Cập nhật giá trị của phần tử trong mảng có giá trị nhất định
db.coll.updateOne({ _id: 1, grades: 80 }, { $set: { 'grades.$': 82 } });
// Tăng giá trị của mọi phần tử trong mảng
db.coll.updateMany({}, { $inc: { 'grades.$[]': 10 } });
// Đặt giá trị mới cho mọi phần tử trong mảng thỏa mãn điều kiện
db.coll.update({}, { $set: { 'grades.$[element]': 100 } }, { multi: true, arrayFilters: [{ element: { $gte: 100 } }] });
Giải thích:
$push
: Thêm một phần tử vào cuối mảng.$pull
: Xóa phần tử từ mảng.$addToSet
: Thêm một phần tử vào mảng chỉ nếu nó không tồn tại.$pop
: Xóa phần tử cuối cùng hoặc đầu tiên từ mảng.$pullAll
: Xóa nhiều phần tử từ mảng.$each
: Sử dụng trong$push
để thêm nhiều phần tử vào mảng.$set
: Đặt giá trị mới cho một phần tử trong mảng.$[element]
: Dùng trongarrayFilters
để áp dụng điều kiện cho các phần tử trong mảng khi thực hiện cập nhật.
⚡️ Update many
db.coll.update({ year: 1999 }, { $set: { decade: "90's" } }, { multi: true });
db.coll.updateMany({ year: 1999 }, { $set: { decade: "90's" } });
Giải thích:
-
Cách 1: Sử dụng
update
với"multi": true
:{"year": 1999}
: Điều kiện để lọc các bản ghi cần cập nhật.{$set: {"decade": "90's"}}
: Thực hiện cập nhật giá trị của trường "decade" thành "90's".{"multi": true}
: Cho phép cập nhật nhiều bản ghi thỏa mãn điều kiện.
-
Cách 2: Sử dụng
updateMany
:{"year": 1999}
: Điều kiện để lọc các bản ghi cần cập nhật.{$set: {"decade": "90's"}}
: Thực hiện cập nhật giá trị của trường "decade" thành "90's".
Hai cách này đều thích hợp để cập nhật nhiều bản ghi cùng một lúc. Tuy nhiên, từ phiên bản MongoDB 4.2 trở đi, sử dụng updateMany
được khuyến khích hơn do nó là một phương pháp rõ ràng và đơn giản hơn.
⚡️ FindOneAndUpdate: Câu lệnh findOneAndUpdate
trong MongoDB được sử dụng để tìm kiếm một bản ghi đầu tiên thỏa mãn điều kiện và cập nhật nó theo một số thay đổi xác định. Dưới đây là giải thích cho câu lệnh cụ thể này:
db.coll.findOneAndUpdate(
{ name: 'Max' }, // Điều kiện để tìm bản ghi cần cập nhật
{ $inc: { points: 5 } }, // Thực hiện cộng 5 vào trường "points"
{ returnNewDocument: true }, // Trả về bản ghi đã được cập nhật (MongoDB 3.2+)
);
findOneAndUpdate
trả về bản ghi trước khi cập nhật. Nếu bạn muốn nhận được bản ghi sau khi cập nhật, bạn có thể sử dụng tùy chọn returnNewDocument
hoặc returnDocument
.
⚡️ Upsert: Upsert là viết tắt của "update" và "insert", và nó được sử dụng để cập nhật một tài liệu nếu nó tồn tại, hoặc chèn một tài liệu mới nếu nó không tồn tại. Dưới đây là giải thích cho câu lệnh:
db.coll.update(
{ _id: 1 }, // Điều kiện để tìm kiếm tài liệu
{
$set: { item: 'apple' }, // Cập nhật trường "item" thành "apple"
$setOnInsert: { defaultQty: 100 },
}, // Chỉ cập nhật "defaultQty" nếu tạo mới tài liệu
{ upsert: true }, // Thực hiện upsert
);
⚡️ Lệnh thay thế (Replace)
Câu lệnh replaceOne
trong MongoDB được sử dụng để thay thế một bản ghi duy nhất trong một bảng (collection) bằng một bản ghi mới.
db.coll.replaceOne(
{ name: 'Max' }, // Điều kiện để tìm bản ghi cần thay thế
{ firstname: 'Maxime', surname: 'Beugnet' }, // Bản ghi mới để thay thế
);
replaceOne
thực hiện thay thế toàn bộ tài liệu, nó sẽ xóa hết các trường trong bản ghi cũ và thay thế chúng bằng các giá trị mới được chỉ định. Nếu bạn chỉ muốn cập nhật một số trường mà giữ nguyên các trường khác, bạn có thể sử dụng updateOne
với $set
.
⚡️ Lệnh lưu (Save)
Câu lệnh save
trong MongoDB được sử dụng để chèn hoặc cập nhật một tài liệu trong một bảng (collection). Nếu tài liệu có trường _id
, save
sẽ thực hiện cập nhật, ngược lại, nó sẽ chèn một tài liệu mới. Dưới đây là giải thích cho câu lệnh này:
db.coll.save({ item: 'book', qty: 40 });
save
không phải là phương pháp được khuyến khích sử dụng trong MongoDB hiện đại. Thay vào đó, bạn thường nên sử dụng insertOne
, updateOne
, hoặc replaceOne
để thực hiện chính xác các thao tác chèn hoặc cập nhật mà bạn đang cần.
⚡️ Write concern
Câu lệnh trong ví dụ sử dụng tùy chọn "writeConcern" để chỉ định cách MongoDB xác nhận ghi (write concern) khi thực hiện một câu lệnh cập nhật. Dưới đây là giải thích cho câu lệnh này:
db.coll.update(
{}, // Điều kiện để lọc các bản ghi cần cập nhật (trong trường này là tất cả)
{ $set: { x: 1 } }, // Thực hiện cập nhật giá trị của trường "x" thành 1
{ writeConcern: { w: 'majority', wtimeout: 5000 } }, // Tùy chọn writeConcern
);
Write concern
quyết định khi nào một hoạt động ghi được coi là hoàn tất và khi nào MongoDB sẽ trả về kết quả. Điều này có ảnh hưởng đặc biệt khi bạn làm việc trong môi trường replica set, nơi có nhiều bản sao của dữ liệu.
⚡️ Tìm kiếm (Find)
// Trả về một bản ghi đơn
db.coll.findOne();
// Trả về một con trỏ (cursor) - Hiển thị 20 kết quả - Sử dụng "it" để hiển thị thêm
db.coll.find();
// Hiển thị kết quả đẹp hơn
db.coll.find().pretty();
// Tìm kiếm với điều kiện, hiểu như là AND ngầm định
db.coll.find({ name: 'Max', age: 32 });
// Tìm kiếm theo một trường datetime cụ thể
db.coll.find({ date: ISODate('2020-09-25T13:57:17.180Z') });
// Hiển thị kế hoạch thực hiện hoặc thống kê thực hiện
db.coll.find({ name: 'Max', age: 32 }).explain('executionStats'); // "queryPlanner" hoặc "allPlansExecution" cũng có thể được sử dụng
// Lấy giá trị duy nhất của một trường cụ thể
db.coll.distinct('name');
⚡️ Lệnh đếm (Count)
// Đếm số lượng bản ghi thỏa mãn điều kiện (ước lượng dựa trên dữ liệu metadata của bảng)
db.coll.count({ age: 32 });
// Ước lượng tổng số lượng tài liệu trong bảng (dựa trên dữ liệu metadata của bảng)
db.coll.estimatedDocumentCount();
// Đếm số lượng bản ghi chính xác thỏa mãn điều kiện (sử dụng pipeline aggregation)
db.coll.countDocuments({ age: 32 });
⚡️ Lệnh so sánh (Comparison)
// Tìm các bản ghi có trường "year" lớn hơn 1970
db.coll.find({ year: { $gt: 1970 } });
// Tìm các bản ghi có trường "year" lớn hơn hoặc bằng 1970
db.coll.find({ year: { $gte: 1970 } });
// Tìm các bản ghi có trường "year" nhỏ hơn 1970
db.coll.find({ year: { $lt: 1970 } });
// Tìm các bản ghi có trường "year" nhỏ hơn hoặc bằng 1970
db.coll.find({ year: { $lte: 1970 } });
// Tìm các bản ghi có trường "year" khác 1970
db.coll.find({ year: { $ne: 1970 } });
// Tìm các bản ghi có trường "year" trong danh sách [1958, 1959]
db.coll.find({ year: { $in: [1958, 1959] } });
// Tìm các bản ghi có trường "year" không nằm trong danh sách [1958, 1959]
db.coll.find({ year: { $nin: [1958, 1959] } });
Giải thích:
$gt
: Greater Than (lớn hơn).$gte
: Greater Than or Equal (lớn hơn hoặc bằng).$lt
: Less Than (nhỏ hơn).$lte
: Less Than or Equal (nhỏ hơn hoặc bằng).$ne
: Not Equal (khác).$in
: Trường có thể có một trong các giá trị trong danh sách.$nin
: Trường không thể có bất kỳ giá trị nào trong danh sách.
⚡️ Logical
// Tìm các bản ghi có trường "name" không bằng "Max"
db.coll.find({ name: { $not: { $eq: 'Max' } } });
// Tìm các bản ghi có trường "year" bằng 1958 hoặc 1959
db.coll.find({ $or: [{ year: 1958 }, { year: 1959 }] });
// Tìm các bản ghi không có trường "price" là 1.99 và không có trường "sale" là true
db.coll.find({ $nor: [{ price: 1.99 }, { sale: true }] });
// Tìm các bản ghi có các điều kiện phức tạp sử dụng $and, $or
db.coll.find({
$and: [{ $or: [{ qty: { $lt: 10 } }, { qty: { $gt: 50 } }] }, { $or: [{ sale: true }, { price: { $lt: 5 } }] }],
});
Giải thích:
$not
: Toán tử NOT, nghĩa là không bằng.$or
: Toán tử OR, nghĩa là bất kỳ điều kiện nào trong mảng là đúng thì tài liệu sẽ được chấp nhận.$nor
: Toán tử NOR, nghĩa là nếu không có điều kiện nào trong mảng là đúng thì tài liệu sẽ được chấp nhận.$and
: Toán tử AND, nghĩa là tất cả các điều kiện trong mảng phải đúng để tài liệu được chấp nhận. Trong ví dụ cuối cùng, có hai điều kiện trong mảng $and, và mỗi điều kiện lại là một mảng $or.
⚡️ Element
// Tìm các bản ghi có trường "name" tồn tại (không null và không undefined)
db.coll.find({ name: { $exists: true } });
// Tìm các bản ghi có trường "zipCode" có kiểu dữ liệu là số nguyên (Double)
db.coll.find({ zipCode: { $type: 2 } });
// Tìm các bản ghi có trường "zipCode" có kiểu dữ liệu là chuỗi (String)
db.coll.find({ zipCode: { $type: 'string' } });
⚡️ Aggregation Pipeline
Câu lệnh trên sử dụng Aggregation Pipeline trong MongoDB để thực hiện một loạt các phép toán trên dữ liệu.
db.coll.aggregate([
// Giai đoạn 1: Lọc các bản ghi có trường "status" là "A"
{ $match: { status: 'A' } },
// Giai đoạn 2: Nhóm các bản ghi theo trường "cust_id" và tính tổng số lượng theo trường "amount"
{ $group: { _id: '$cust_id', total: { $sum: '$amount' } } },
// Giai đoạn 3: Sắp xếp kết quả theo trường "total" theo thứ tự giảm dần
{ $sort: { total: -1 } },
]);
⚡️ Text search with a "text" index: sử dụng tìm kiếm văn bản (text search) trong MongoDB với một chỉ mục (index) văn bản đã được tạo trước đó. Dưới đây là giải thích cho câu lệnh này:
db.coll
.find(
{ $text: { $search: 'cake' } }, // Tìm kiếm văn bản chứa từ "cake"
{ score: { $meta: 'textScore' } }, // Lấy điểm số của kết quả tìm kiếm
)
.sort(
{ score: { $meta: 'textScore' } }, // Sắp xếp kết quả theo điểm số giảm dần
);
Giải thích:
$text
: Toán tử tìm kiếm văn bản trong MongoDB.$search: "cake"
: Tìm kiếm văn bản chứa từ "cake".{score: {$meta: "textScore"}}
: Trích xuất điểm số của kết quả tìm kiếm và hiển thị nó trong trường "score"..sort({score: {$meta: "textScore"}})
: Sắp xếp kết quả theo điểm số giảm dần, đảm bảo rằng các kết quả có điểm số cao hơn sẽ được hiển thị đầu tiên.
Lưu ý rằng để sử dụng tìm kiếm văn bản, bạn cần tạo một chỉ mục văn bản cho trường bạn muốn tìm kiếm. Ví dụ:
db.coll.createIndex({ fieldName: 'text' });
Trong đó, fieldName
là tên của trường bạn muốn tìm kiếm văn bản.
⚡️ Regex: sử dụng biểu thức chính quy (regex) trong MongoDB để thực hiện tìm kiếm dựa trên mẫu chỉ định.
// Tìm các bản ghi có trường "name" bắt đầu bằng chữ cái "M"
db.coll.find({ name: /^Max/ });
// Tìm các bản ghi có trường "name" khớp chính xác với chuỗi "Max", không phân biệt chữ hoa, chữ thường
db.coll.find({ name: /^Max$/i });
⚡️ Mảng (Array)
// Tìm các bản ghi có tất cả các phần tử trong trường "tags" là ["Realm", "Charts"]
db.coll.find({ tags: { $all: ['Realm', 'Charts'] } });
// Tìm các bản ghi có trường "field" là một mảng và có đúng 2 phần tử
// Lưu ý: Sử dụng $size có thể làm tăng tải hiệu suất và không thể tạo chỉ mục
db.coll.find({ field: { $size: 2 } });
// Tìm các bản ghi có trường "results" là một mảng chứa ít nhất một phần tử thỏa mãn điều kiện
db.coll.find({ results: { $elemMatch: { product: 'xyz', score: { $gte: 8 } } } });
Giải thích:
$all
: Toán tử này sử dụng để tìm kiếm các bản ghi mà chứa tất cả các giá trị trong mảng được chỉ định. Trong ví dụ đầu tiên, nó tìm các bản ghi có tất cả các phần tử trong trường "tags" là ["Realm", "Charts"].$size
: Toán tử này sử dụng để tìm kiếm các bản ghi mà trường mảng có số lượng phần tử chính xác bằng một giá trị được chỉ định. Trong ví dụ thứ hai, nó tìm các bản ghi có trường "field" là một mảng và có đúng 2 phần tử. Lưu ý rằng việc sử dụng$size
có thể không hiệu quả và không thể tạo chỉ mục, vì nó không thể sử dụng chỉ mục để thực hiện tìm kiếm này.$elemMatch
: Toán tử này sử dụng để tìm kiếm các bản ghi mà mảng có ít nhất một phần tử thỏa mãn tất cả các điều kiện được chỉ định. Trong ví dụ thứ ba, nó tìm các bản ghi có trường "results" là một mảng chứa ít nhất một phần tử thỏa mãn điều kiện là "product" là "xyz" và "score" ít nhất là 8.
⚡️ Projections
// Tìm các bản ghi có trường "x" bằng 1 và trả về trường "actors" và "_id"
db.coll.find({ x: 1 }, { actors: 1 });
// Tìm các bản ghi có trường "x" bằng 1 và chỉ trả về trường "actors" (loại bỏ "_id")
db.coll.find({ x: 1 }, { actors: 1, _id: 0 });
// Tìm các bản ghi có trường "x" bằng 1 và trả về tất cả các trường trừ "actors" và "summary"
db.coll.find({ x: 1 }, { actors: 0, summary: 0 });
⚡️ Sort, skip, limit
Câu lệnh sử dụng các phương thức sort
, skip
, và limit
trong MongoDB để thực hiện sắp xếp, bỏ qua (skip), và giới hạn (limit) kết quả tìm kiếm.
// Tìm tất cả các bản ghi, sắp xếp theo trường "year" tăng dần, sau đó theo trường "rating" giảm dần,
// Bỏ qua 10 kết quả, và giới hạn kết quả trả về là 3 bản ghi
db.coll.find({}).sort({ year: 1, rating: -1 }).skip(10).limit(3);
Giải thích:
.find({})
: Tìm tất cả các bản ghi trong bảng (không có điều kiện tìm kiếm)..sort({"year": 1, "rating": -1})
: Sắp xếp kết quả theo trường "year" tăng dần (1) và theo trường "rating" giảm dần (-1)..skip(10)
: Bỏ qua 10 kết quả đầu tiên. Nó sẽ bắt đầu trả về kết quả từ kết quả thứ 11..limit(3)
: Giới hạn kết quả trả về chỉ là 3 bản ghi.
Như vậy, kết quả cuối cùng sẽ là danh sách 3 bản ghi, bắt đầu từ kết quả thứ 11 của bảng, được sắp xếp theo trường "year" tăng dần và theo trường "rating" giảm dần.
⚡️ Read Concern được sử dụng để xác định mức độ đọc liên quan đến việc đọc từ một bảng trong MongoDB.
// Đọc tất cả các bản ghi từ bảng và sử dụng mức độ đọc "majority"
db.coll.find().readConcern('majority');
3. Databases và Collections
⚡️ Drop
db.coll.drop()
: Xóa bảng (collection) cụ thể từ cơ sở dữ liệu. Câu lệnh này cũng xóa các định nghĩa chỉ mục (index) của bảng đó.
db.coll.drop();
db.dropDatabase()
: Xóa bỏ cơ sở dữ liệu hiện tại. Lưu ý rằng câu lệnh này có thể xóa toàn bộ cơ sở dữ liệu, bao gồm tất cả các bảng và dữ liệu trong đó. Nó sẽ hỏi lại xác nhận để đảm bảo rằng bạn không đang thực hiện trên môi trường sản phẩm (PROD cluster) do có thể dẫn đến mất mát dữ liệu quan trọng.
db.dropDatabase();
Chú ý:
- Khi sử dụng các câu lệnh xóa (
drop
), hãy chắc chắn rằng bạn đã xác nhận và đang làm việc trên môi trường test hoặc đang thực hiện một hành động cẩn thận trên môi trường production. - Đặc biệt,
db.dropDatabase()
nên được sử dụng cẩn thận và chỉ khi bạn chắc chắn rằng bạn không cần dữ liệu trong cơ sở dữ liệu đó nữa.
⚡️ Create Collection
Ví dụ: tạo một bảng mới (collection) có tên là "contacts" và định nghĩa các quy tắc (validator) về cấu trúc dữ liệu trong bảng đó.
// Tạo bảng "contacts" và định nghĩa quy tắc về cấu trúc dữ liệu
db.createCollection('contacts', {
validator: {
$jsonSchema: {
bsonType: 'object',
required: ['phone'],
properties: {
phone: {
bsonType: 'string',
description: 'must be a string and is required',
},
email: {
bsonType: 'string',
pattern: '@mongodb.com$',
description: 'must be a string and match the regular expression pattern',
},
status: {
enum: ['Unknown', 'Incomplete'],
description: 'can only be one of the enum values',
},
},
},
},
});
⚡️ Các hàm Collection khác
// Trả về thống kê về bảng, bao gồm thông tin như số lượng bản ghi, kích thước bảng, chỉ mục, và các thông số khác.
db.coll.stats();
// Trả về kích thước lưu trữ của bảng, bao gồm cả dữ liệu và chỉ mục.
db.coll.storageSize();
// Trả về kích thước tổng của tất cả các chỉ mục trên bảng.
db.coll.totalIndexSize();
// Trả về tổng kích thước của bảng, bao gồm cả dữ liệu và chỉ mục.
db.coll.totalSize();
// Kiểm tra sự hợp lệ của cấu trúc và dữ liệu của bảng. Tham số {full: true} yêu cầu kiểm tra đầy đủ cấu trúc.
db.coll.validate({ full: true });
// Đổi tên bảng thành "new_coll". Tham số thứ hai là true để xóa bảng đích nếu nó đã tồn tại.
db.coll.renameCollection('new_coll', true);
4. Indexes
⚡️ Indexes cơ bản
// Trả về danh sách tất cả các chỉ mục trên bảng, bao gồm cả các chỉ mục mặc định.
db.coll.getIndexes();
// Trả về danh sách các khóa của tất cả các chỉ mục trên bảng.
db.coll.getIndexKeys();
// Xóa chỉ mục có tên "name_1" khỏi bảng.
db.coll.dropIndex('name_1');
// Ẩn chỉ mục có tên "name_1" khỏi truy vấn giảm hiệu suất.
db.coll.hideIndex('name_1');
// Hiển thị lại chỉ mục có tên "name_1" để nó có thể được sử dụng trong truy vấn.
db.coll.unhideIndex('name_1');
⚡️ Tạo Indexes
// Index Types
db.coll.createIndex({ name: 1 }); // Tạo một chỉ mục đơn (single field index) trên trường "name" tăng dần (1).
db.coll.createIndex({ name: 1, date: 1 }); // Tạo một chỉ mục kết hợp (compound index) trên trường "name" và "date" cả hai tăng dần (1).
db.coll.createIndex({ foo: 'text', bar: 'text' }); // Tạo một chỉ mục văn bản (text index) cho các trường "foo" và "bar".
db.coll.createIndex({ '$**': 'text' }); // Tạo một chỉ mục văn bản với ký tự đại diện (wildcard text index).
db.coll.createIndex({ 'userMetadata.$**': 1 }); // Tạo một chỉ mục đơn trên tất cả các giá trị trong trường "userMetadata" có kiểu đối tượng.
db.coll.createIndex({ loc: '2d' }); // Tạo một chỉ mục không gian hai chiều (2d index) trên trường "loc".
db.coll.createIndex({ loc: '2dsphere' }); // Tạo một chỉ mục không gian hai chiều với hình dạng cầu (2dsphere index) trên trường "loc".
db.coll.createIndex({ _id: 'hashed' }); // Tạo một chỉ mục băm (hashed index) trên trường "_id".
// Index Options
db.coll.createIndex({ lastModifiedDate: 1 }, { expireAfterSeconds: 3600 }); // Tạo một chỉ mục với thời gian sống (TTL index) trên trường "lastModifiedDate" để tự động xóa các bản ghi sau 3600 giây.
db.coll.createIndex({ name: 1 }, { unique: true }); // Tạo một chỉ mục duy nhất trên trường "name".
db.coll.createIndex({ name: 1 }, { partialFilterExpression: { age: { $gt: 18 } } }); // Tạo một chỉ mục riêng (partial index) trên trường "name" với điều kiện tuổi lớn hơn 18.
db.coll.createIndex({ name: 1 }, { collation: { locale: 'en', strength: 1 } }); // Tạo một chỉ mục không phân biệt chữ hoa chữ thường (case-insensitive index) trên trường "name" với collation.
db.coll.createIndex({ name: 1 }, { sparse: true }); // Tạo một chỉ mục tương đối (sparse index) trên trường "name".
5. Others
⚡️ Handy commands
use admin
db.createUser({ user: 'root', pwd: passwordPrompt(), roles: ['root'] });
db.dropUser('root');
db.auth('user', passwordPrompt());
use test
db.getSiblingDB('dbname');
db.currentOp();
db.killOp(123); // opid
db.fsyncLock();
db.fsyncUnlock();
db.getCollectionNames();
db.getCollectionInfos();
db.printCollectionStats();
db.stats();
db.getReplicationInfo();
db.printReplicationInfo();
db.isMaster();
db.hostInfo();
db.printShardingStatus();
db.shutdownServer();
db.setSlaveOk();
db.getSlaveOk();
db.getProfilingLevel();
db.getProfilingStatus();
db.setProfilingLevel(1, 200); // 0 == OFF, 1 == ON with slowms, 2 == ON
db.enableFreeMonitoring();
db.disableFreeMonitoring();
db.getFreeMonitoringStatus();
db.createView('viewName', 'sourceColl', [{ $project: { department: 1 } }]);
⚡️ Replica Set
rs.status()
: Lấy thông tin trạng thái của replica set.
rs.status();
rs.initiate({...})
: Khởi tạo một replica set với cấu hình được chỉ định.
rs.initiate({
_id: 'replicaTest',
members: [
{ _id: 0, host: '127.0.0.1:27017' },
{ _id: 1, host: '127.0.0.1:27018' },
{ _id: 2, host: '127.0.0.1:27019', arbiterOnly: true },
],
});
rs.add("mongodbd1.example.net:27017")
: Thêm một thành viên mới vào replica set.
rs.add('mongodbd1.example.net:27017');
rs.addArb("mongodbd2.example.net:27017")
: Thêm một arbiter mới vào replica set.
rs.addArb('mongodbd2.example.net:27017');
rs.remove("mongodbd1.example.net:27017")
: Xóa một thành viên khỏi replica set.
rs.remove('mongodbd1.example.net:27017');
rs.conf()
: Lấy cấu hình hiện tại của replica set.
rs.conf();
rs.isMaster()
: Kiểm tra xem nút hiện tại có phải là primary không.
rs.isMaster();
rs.printReplicationInfo()
: In ra thông tin chi tiết về quá trình sao chép.
rs.printReplicationInfo();
rs.printSlaveReplicationInfo()
: In ra thông tin chi tiết về các secondary nodes trong replica set.
rs.printSlaveReplicationInfo();
rs.reconfig(<valid_conf>)
: Thay đổi cấu hình của replica set.
rs.reconfig(\<valid_conf>)
rs.slaveOk()
: Bật chế độ đọc từ secondary.
rs.slaveOk();
rs.stepDown(20, 5)
: Bắt buộc primary step down và chuyển quyền sang một secondary khác. Tham số đầu tiên là thời gian primary step down (giây), tham số thứ hai là thời gian để secondary bắt kịp (giây).
rs.stepDown(20, 5);
⚡️ Sharded Cluster
sh.status()
: Lấy trạng thái hiện tại của sharded cluster.
sh.status();
sh.addShard("rs1/mongodbd1.example.net:27017")
: Thêm một shard mới vào sharded cluster.
sh.addShard('rs1/mongodbd1.example.net:27017');
sh.shardCollection("mydb.coll", {zipcode: 1})
: Shard một collection dựa trên key "zipcode".
sh.shardCollection('mydb.coll', { zipcode: 1 });
sh.moveChunk("mydb.coll", { zipcode: "53187" }, "shard0019")
: Di chuyển một chunk của dữ liệu từ shard hiện tại đến shard mới.
sh.moveChunk('mydb.coll', { zipcode: '53187' }, 'shard0019');
sh.splitAt("mydb.coll", {x: 70})
: Chia một chunk tại giá trị x=70.
sh.splitAt('mydb.coll', { x: 70 });
sh.splitFind("mydb.coll", {x: 70})
: Tìm điểm chia tiếp theo cho một collection.
sh.splitFind('mydb.coll', { x: 70 });
sh.disableAutoSplit()
: Tắt chế độ tự động chia shard.
sh.disableAutoSplit();
sh.enableAutoSplit()
: Bật chế độ tự động chia shard.
sh.enableAutoSplit();
sh.startBalancer()
: Bắt đầu quá trình cân bằng shard.
sh.startBalancer();
sh.stopBalancer()
: Dừng quá trình cân bằng shard.
sh.stopBalancer();
sh.disableBalancing("mydb.coll")
: Tắt cân bằng cho một collection cụ thể.
sh.disableBalancing('mydb.coll');
sh.enableBalancing("mydb.coll")
: Bật cân bằng cho một collection cụ thể.
sh.enableBalancing('mydb.coll');
sh.getBalancerState()
: Lấy trạng thái hiện tại của cân bằng shard.
sh.getBalancerState();
sh.setBalancerState(true/false)
: Thiết lập trạng thái của cân bằng shard (true: bật, false: tắt).
sh.setBalancerState(true);
sh.isBalancerRunning()
: Kiểm tra xem quá trình cân bằng shard đang chạy hay không.
sh.isBalancerRunning();
sh.addTagRange("mydb.coll", {state: "NY", zip: MinKey }, { state: "NY", zip: MaxKey }, "NY")
: Đặt tag cho một range của dữ liệu trong một collection.
sh.addTagRange('mydb.coll', { state: 'NY', zip: MinKey }, { state: 'NY', zip: MaxKey }, 'NY');
sh.removeTagRange("mydb.coll", {state: "NY", zip: MinKey }, { state: "NY", zip: MaxKey }, "NY")
: Xóa tag cho một range của dữ liệu trong một collection.
sh.removeTagRange('mydb.coll', { state: 'NY', zip: MinKey }, { state: 'NY', zip: MaxKey }, 'NY');
sh.addShardTag("shard0000", "NYC")
: Đặt tag cho một shard.
sh.addShardTag('shard0000', 'NYC');
sh.removeShardTag("shard0000", "NYC")
: Xóa tag của một shard.
sh.removeShardTag('shard0000', 'NYC');
sh.addShardToZone("shard0000", "JFK")
: Đặt shard vào một zone.
sh.addShardToZone('shard0000', 'JFK');
sh.removeShardFromZone("shard0000", "NYC")
: Xóa shard khỏi một zone.
sh.removeShardFromZone('shard0000', 'NYC');
sh.removeRangeFromZone("mydb.coll", {a: 1, b: 1}, {a: 10, b: 10})
: Xóa một phạm vi (range) từ một zone.
sh.removeRangeFromZone('mydb.coll', { a: 1, b: 1 }, { a: 10, b: 10 });
⚡️ Change Streams
// Tạo một cursor Change Stream để theo dõi sự thay đổi trong collection coll, với điều kiện chỉ lấy những sự kiện có operationType là "insert".
watchCursor = db.coll.watch([{ $match: { operationType: 'insert' } }]);
// Chạy vòng lặp while cho đến khi cursor không còn dữ liệu để đọc.
while (!watchCursor.isExhausted()) {
if (watchCursor.hasNext()) {
print(tojson(watchCursor.next()));
}
}