Documents trong Mongoose
Trong bài viết này chúng ta sẽ tìm hiểu về documents trong Mongoose. Documents đại diện cho các dữ liệu được lưu trữ trong MongoDB. Trong Mongoose các khái niệm về Model và Documents có mối liên hệ chặt chẽ với nhau.
1. Documents vs Models
Document và Models là hai khái niệm khác biệt nhau nhưng có mối quan hệ chặt chẽ với nhau. Trong Mongoose Model là một lớp của Document, khi chúng ta khởi tạo môt Model đồng nghĩa với nó là chúng ta khởi tạo một document.
const MyModel = mongoose.model('Test', new Schema({ name: String })); const doc = new MyModel(); doc instanceof MyModel; // true doc instanceof mongoose.Model; // true doc instanceof mongoose.Document; // true
Trong Mongoose, một document bắt buộc nên đi với Model, không nên tạo một document mà không sử dụng đến Model.
2. Nhận giá trị
Khi bạn lấy một document từ MongoDB sử dụng model function như là findOne(), find(),...Mongoose sẽ trả lại cho bạn document type . Ví dụ như bên dưới:
Bài viết này được đăng tại [free tuts .net]
const doc = await MyModel.findOne(); doc instanceof MyModel; // true doc instanceof mongoose.Model; // true doc instanceof mongoose.Document; // true
3. Cập nhật giá trị
Mongoose documents theo dõi các thay đổi. Bạn có thể cập nhật các các giá trị bằng cách thay đổi các giá trị của thuộc tính trong document và Mongoose sẽ tự động nhận thấy sự thay đổi và cập nhật.
doc.name = 'foo'; // Tương đương với `updateOne({ _id: doc._id }, { $set: { name: 'foo' } })` // trong MongoDB. await doc.save();
Nếu nhận thấy một lỗi xảy ra, ví dụ như không tìm thấy _id
, Mongoose sẽ trả về thông báo lỗi : DocumentNotFoundError
const doc = await MyModel.findOne(); // Xóa document câu lệnh tiếp theo không thể cập nhật await MyModel.deleteOne({ _id: doc._id }); //Tiến hành cập nhật doc.name = 'foo'; //Lưu cập nhật await doc.save(); // Throws DocumentNotFoundError
Trong mọi trường hợp function save()
là cách tốt nhất để cập nhật một document lúc này các tính năng như validation và middleware sẽ được sử dụng. Ngoài ra nếu bạn không muốn Mongoose validation dữ liệu và sử dụng middleware thì bạn có thể sử dụng:
await MyModel.updateMany({}, { $set: { name: 'foo' } });
Lưu ý rằng cách method như update()
, updateMany(),
findOneAndUpdate()
, etc...khi sử dụng không cần phải dùng đến save()
middleware. Nếu bạn cần sử dụng validation, middleware thì cân nhắc sử dụng save()
middleware.
4. Validating (Kiểm tra dữ liệu)
Các document cần phải kiểm tra trước khi được xử lý, Mongoose có một phương thức xác giúp xác thực được gọi là validate()
. Giả sử mình sẽ tiến hành validate một document:
const schema = new Schema({ name: String, age: { type: Number, min: 0 } }); const Person = mongoose.model('Person', schema); let p = new Person({ name: 'foo', age: 'bar' }); // Thất bại bởi age chỉ được thêm dạng number await p.validate(); let p2 = new Person({ name: 'foo', age: -1 }); // Lỗi vì `age` (-1) nhỏ hơn 0. await p2.validate();
Mongoose cho phép chúng ta validation()
trong cách method như updateOne()
, InsertOne()
,...để tinh chỉnh các trạng thái validate bạn cần thêm options
vào runValidators: true
.
// Thất bại bởi age chỉ được thêm dạng number await Person.updateOne({}, { age: 'bar' }); // Lỗi vì `age` (-1) nhỏ hơn 0. await Person.updateOne({}, { age: -1 }, { runValidators: true });
5. Ghi đè một document
Có 2 cách để ghi đè một document, cách thứ nhất là bạn thay đổi tất cả các thuộc tính trong đó, Mongoose hỗ trợ một phương thức có tên overwrite()
theo sau đó là save()
.
const doc = await Person.findOne({ _id }); // Update lại thuộc tính name doc.overwrite({ name: 'Freetuts.net' }); await doc.save();
Còn cách khác có thể dùng là :
await Person.replaceOne({ _id }, { name: 'Freetuts.net' });
Trên đây là những kiến thức cơ bản về Documents trong Mongoose. Mong bài viết này có thể giúp ích cho bạn cho việc lập trình với NodeJS, cảm ơn bạn đã quan tâm bài viết này.