Skip to main content

5. Query & Aggregation

Queries

https://mongoosejs.com/docs/queries.html

  • Model.deleteMany()
  • Model.deleteOne()
  • Model.find()
  • Model.findById()
  • Model.findByIdAndDelete()
  • Model.findByIdAndRemove()
  • Model.findByIdAndUpdate()
  • Model.findOne()
  • Model.findOneAndDelete()
  • Model.findOneAndRemove()
  • Model.findOneAndReplace()
  • Model.findOneAndUpdate()
  • Model.replaceOne()
  • Model.updateMany()
  • Model.updateOne()

Query Selectors

https://www.mongodb.com/docs/manual/reference/operator/query/

Comparison

NameDescription
$eqMatches values that are equal to a specified value.
$gtMatches values that are greater than a specified value.
$gteMatches values that are greater than or equal to a specified value.
$inMatches any of the values specified in an array.
$ltMatches values that are less than a specified value.
$lteMatches values that are less than or equal to a specified value.
$neMatches all values that are not equal to a specified value.
$ninMatches none of the values specified in an array.

Logical

NameDescription
$andJoins query clauses with a logical AND returns all documents that match the conditions of both clauses.
$notInverts the effect of a query expression and returns documents that do not match the query expression.
$norJoins query clauses with a logical NOR returns all documents that fail to match both clauses.
$orJoins query clauses with a logical OR returns all documents that match the conditions of either clause.

Array

NameDescription
$allMatches arrays that contain all elements specified in the query.
$elemMatchSelects documents if element in the array field matches all the specified $elemMatch conditions.
$sizeSelects documents if the array field is a specified size.

Sorting

Sorting is how you can ensure you query results come back in the desired order.

tip

Specify in the sort parameter the field or fields to sort by and a value of 1 or -1 to specify an ascending or descending sort respectively.

const personSchema = new mongoose.Schema({
age: Number,
});

const Person = mongoose.model('Person', personSchema);
for (let i = 0; i < 10; i++) {
await Person.create({ age: i });
}

await Person.find().sort({ age: -1 }); // returns age starting from 10 as the first entry
await Person.find().sort({ age: 1 }); // returns age starting from 0 as the first entry
// find all documents
await MyModel.find({});

// find all documents named john and at least 18
await MyModel.find({ name: 'john', age: { $gte: 18 } }).exec();

// executes, name LIKE john and only selecting the "name" and "friends" fields
await MyModel.find({ name: /john/i }, 'name friends').exec();

// passing options
await MyModel.find({ name: /john/i }, null, { skip: 10 }).exec();

Find

// find all documents
await MyModel.find({});

// find all documents named john and at least 18
await MyModel.find({ name: 'john', age: { $gte: 18 } }).exec();

// executes, name LIKE john and only selecting the "name" and "friends" fields
await MyModel.find({ name: /john/i }, 'name friends').exec();

// passing options
await MyModel.find({ name: /john/i }, null, { skip: 10 }).exec();

Bài tập

C.R.U.D

Create, Update, Delete, Get, GetById => POST, PATCH, DELETE, GET, GET(id)

  1. Categories
  2. Suppliers
  3. Customers
  4. Employees
  5. Products
  6. Orders -> OrderDetails

QUERY & AGGREGATION

  1. Hiển thị tất cả các mặt hàng có giảm giá <= 10%
  2. Hiển thị tất cả các mặt hàng có giảm giá <= 10%, và chi tiết danh mục, nhà cung cấp
  3. Hiển thị tất cả các mặt hàng có tồn kho <= 5
  4. Hiển thị tất cả các mặt hàng có tồn kho <= 5, và chi tiết danh mục, nhà cung cấp
  5. Hiển thị tất cả các mặt hàng có Giá bán sau khi đã tính giảm giá <= 1000
  6. Hiển thị tất cả các khách hàng có địa chỉ ở Quận Hải Châu
  7. Hiển thị tất cả các khách hàng có năm sinh 1990
  8. Hiển thị tất cả các khách hàng có sinh nhật là hôm nay
  9. Hiển thị tất cả các đơn hàng có trạng thái là COMPLETED
  10. Hiển thị tất cả các đơn hàng có trạng thái là COMPLETED trong ngày hôm nay
  11. Hiển thị tất cả các đơn hàng có trạng thái là status có ngày tạo trong khoảng fromDatetoDate
  12. Hiển thị tất cả các đơn hàng có trạng thái là CANCELED
  13. Hiển thị tất cả các đơn hàng có trạng thái là CANCELED trong ngày hôm nay
  14. Hiển thị tất cả các đơn hàng có hình thức thanh toán là CASH
  15. Hiển thị tất cả các đơn hàng có hình thức thanh toán là CREADIT CARD
  16. Hiển thị tất cả các đơn hàng có địa chỉ giao hàng là Hà Nội
  17. Hiển thị tất cả các nhân viên có sinh nhật là hôm nay
  18. Hiển thị tất cả các nhà cung cấp có tên là: (SONY, SAMSUNG, TOSHIBA, APPLE)
  19. Hiển thị tất cả các đơn hàng cùng với thông tin chi tiết khách hàng (Customer)
  20. Hiển thị tất cả các mặt hàng cùng với thông tin chi tiết của Category và Supplier
  21. Hiển thị tất cả danh mục (Categories) với số lượng hàng hóa trong mỗi danh mục
  22. Hiển thị tất cả nhà cung cấp (Suppliers) với số lượng hàng hóa mỗi nhà cung cấp
  23. Hiển thị tất cả các mặt hàng được bán trong khoảng từ ngày, đến ngày
  24. Hiển thị tất cả các khách hàng mua hàng trong khoảng từ ngày, đến ngày
  25. Hiển thị tất cả các khách hàng mua hàng (với tổng số tiền) trong khoảng từ ngày, đến ngày
  26. Hiển thị tất cả đơn hàng với tổng số tiền
  27. Hiển thị tất cả các nhân viên bán hàng với tổng số tiền bán được
  28. Hiển thị tất cả các mặt hàng không bán được
  29. Hiển thị tất cả các nhà cung cấp không bán được trong khoảng từ ngày, đến ngày
  30. Hiển thị top 3 các nhân viên bán hàng với tổng số tiền bán được từ cao đến thấp trong khoảng từ ngày, đến ngày
  31. Hiển thị top 5 các khách hàng mua hàng với tổng số tiền mua được từ cao đến thấp trong khoảng từ ngày, đến ngày
  32. Hiển thị danh sách các mức giảm giá của cửa hàng
  33. Hiển thị tất cả danh mục (Categories) với tổng số tiền bán được trong mỗi danh mục
  34. Hiển thị tất cả đơn hàng với tổng số tiền mà đã được giao hàng thành công trong khoảng từ ngày, đến ngày
  35. Hiển thị tất cả đơn hàng có tổng số tiền bán hàng sắp xếp từ cao đến thấp trong khoảng từ ngày, đến ngày
  36. Hiển thị tất cả đơn hàng có tổng số tiền bán hàng ít nhất trong khoảng từ ngày, đến ngày
  37. Hiển thị trung bình cộng giá trị các đơn hàng trong khoảng từ ngày, đến ngày