Truy vấn dữ liệu bằng Mongoose

Phùng Hùng

Phùng Hùng

Teacher and Programmer

Các phương thức để truy vấn dữ liệu từ Model

  • Các phương thức để đọc dữ liệu:

    • Model.find()
    • Model.findById()
    • Model.findOne()
  • Các phương thức để cập nhật dữ liệu:

    • Model.findByIdAndUpdate()
    • Model.findOneAndUpdate)()
    • Model.findOneAndReplace()
    • Model.updateOne()
    • Model.updateMany()
    • Model.replaceOne()
  • Các phương thức để xóa dữ liệu

    • Model.deleteOne()
    • Model.deleteMany()
    • Model.findByIdAndDelete()
    • Model.findByIdAndRemove()
    • Model.findOneAndDelete()
    • Model.findOneAndRemove()

Chạy một query

Tất cả các phương thức trên đều trả về một query, để chạy query, gọi phương thức exec và truyền vào một hàm callback. Tất cả các callback đều có dạng callback(error, results). Kết quả results phụ thuộc vào hành động truy vấn.

Có hai cách lọc dữ liệu để truy vấn, cách thứ nhất là thông qua đối tượng:

const query = Person.find({
occupation: /host/,
'name.last': 'Ghost',
age: { $gt: 17, $lt: 66 },
likes: { $in: ['vaporizing', 'talking'] },
});
query
.limit(10)
.sort({ occupation: -1 })
.select({ name: 1, occupation: 1 })
.exec(callback);

hoặc sử dụng query builder:

Person.find({ occupation: /host/ })
.where('name.last')
.equals('Ghost')
.where('age')
.gt(17)
.lt(66)
.where('likes')
.in(['vaporizing', 'talking'])
.limit(10)
.sort('-occupation')
.select('name occupation')
.exec(callback);

Đây là một số query helper thường dùng:

  • all
// `pets` là mảng gồm tất cả các phần tử được liệt kê
MyModel.find().where('pets').all(['dog', 'cat', 'ferret']);
  • and
// color là 'green' và status là 'ok'
query.and([{ color: 'green' }, { status: 'ok' }]);
  • countDocuments
// Đếm số document trả về
const countQuery = model.where({ color: 'black' }).countDocuments();
  • estimatedDocumentCount(): nhanh hơn countDocuments() và phù hợp với collection lớn gồm nhiều document.

  • elemMatch

// trả về các document
// mỗi document có trường `comments`
// là một mảng, có ít nhất một
// phần tử thỏa mãn điều kiện.
query.where('comments').elemMath({ author: 'autobot', votes: { $gte: 5 } });
  • equals
// age = 49
User.where('age').equals(49);
  • exits
// Trả về document tồn tại trường `name`
Thing.where('name').exists();
Thing.where('name').exists(true);
Thing.find().exists('name');
  • gt, gte: lớn hơn/lớn hơn hoặc bằng
  • lt, lte: nhỏ hơn/nhỏ hơn hoặc bằng
  • in: giá trị là một trong các phần tử của mảng nào đó.
  • limit: giới hạn số lượng document trả về.
  • skip: bỏ qua một số document đầu tiên.
  • ne: không bằng
  • nin: ngược với in
  • or: hoặc
  • nor: ngược với or
  • select: lựa chọn các trường trả về
  • sort: sắp xếp kết quả trả về theo một trường nào đó.

Dùng query như promise

Thực ra query không phải là promise, nhưng nó có phương thức .then() chạy query và trả về kết quả dưới dạng một promise vậy nên ta có thể chạy query như promise và cũng có thể sử dụng async/await với nó.