Tài liệu về nhà → Hướng dẫn sử dụng MongoDB → MongoDB Manual
Đã thay đổi trong phiên bản 5.0.
$expr Tất cả các cho phép sử dụng các biểu thức tổng hợp trong ngôn ngữ truy vấn.Allows the use of aggregation expressions within the query language.
$expr có cú pháp sau: has the following syntax:
{ $expr: { <expression> } }
Các đối số có thể là bất kỳ biểu thức tổng hợp hợp lệ. Để biết thêm thông tin, xem biểu thức.
$expr có thể xây dựng các biểu thức truy vấn so sánh các trường từ cùng một tài liệu trong giai đoạn
0. can build query expressions that compare fields from the same document in a
{ "_id" : 1, "category" : "food", "budget": 400, "spent": 450 } { "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 } { "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 } { "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 } { "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 }
{ "_id" : 1, "category" : "food", "budget": 400, "spent": 450 } |
{ "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 } |
{ "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 } |
{ "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 } |
{ "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 } |
Nếu giai đoạn
{ "_id" : 1, "category" : "food", "budget": 400, "spent": 450 } |
{ "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 } |
{ "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 } |
{ "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 } |
{ "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 } |
{ "_id" : 1, "category" : "food", "budget": 400, "spent": 450 } |
{ "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 } |
{ "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 } |
{ "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 } |
{ "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 } |
{ "_id" : 1, "category" : "food", "budget": 400, "spent": 450 } |
{ "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 } |
{ "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 } |
{ "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 } |
{ "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 } |
{ "_id" : 1, "category" : "food", "budget": 400, "spent": 450 } |
{ "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 } |
{ "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 } |
{ "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 } |
{ "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 } |
{ "_id" : 1, "category" : "food", "budget": 400, "spent": 450 } |
{ "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 } |
{ "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 } |
{ "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 } |
{ "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 } |
{ "_id" : 1, "category" : "food", "budget": 400, "spent": 450 } |
{ "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 } |
{ "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 } |
{ "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 } |
{ "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 } |
Bắt đầu từ MongoDB 5.0,
{ "_id" : 1, "category" : "food", "budget": 400, "spent": 450 } |
{ "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 } |
{ "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 } |
{ "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 } |
{ "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 } |
{ "_id" : 1, "category" : "food", "budget": 400, "spent": 450 } |
{ "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 } |
{ "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 } |
{ "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 } |
{ "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 } |
{ "_id" : 1, "category" : "food", "budget": 400, "spent": 450 } |
{ "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 } |
{ "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 } |
{ "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 } |
{ "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 } |
{ "_id" : 1, "category" : "food", "budget": 400, "spent": 450 } |
{ "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 } |
{ "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 } |
{ "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 } |
{ "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 } |
db.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
0 Các toán tử so sánh được đặt trong toán tử $expr có thể sử dụng chỉ mục trên bộ sưu tậpdb.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
2 được tham chiếu trong giai đoạn{ "_id" : 1, "category" : "food", "budget": 400, "spent": 450 } |
{ "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 } |
{ "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 } |
{ "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 } |
{ "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 } |
db.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
2 collection referenced in a{ "_id" : 1, "category" : "food", "budget": 400, "spent": 450 } |
{ "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 } |
{ "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 } |
{ "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 } |
{ "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 } |
Các chỉ mục đa năng không được sử dụng.
Các chỉ mục không được sử dụng để so sánh trong đó toán hạng là một mảng hoặc loại toán hạng không được xác định.
Các chỉ mục không được sử dụng để so sánh với nhiều hơn một toán hạng đường dẫn trường.
Xem xét bộ sưu tập
db.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
4 với các tài liệu sau:{ "_id" : 1, "category" : "food", "budget": 400, "spent": 450 } |
{ "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 } |
{ "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 } |
{ "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 } |
{ "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 } |
Hoạt động sau sử dụng $expr để tìm các tài liệu trong đó số tiền
db.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
6 vượt quádb.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
7:$expr to find documents where thedb.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
6 amount exceeds thedb.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
7:db.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
Hoạt động trả về các kết quả sau:
{ "_id" : 1, "category" : "food", "budget" : 400, "spent" : 450 } |
{ "_id" : 2, "category" : "drinks", "budget" : 100, "spent" : 150 } |
{ "_id" : 5, "category" : "travel", "budget" : 200, "spent" : 650 } |
Một số truy vấn yêu cầu khả năng thực hiện logic có điều kiện khi xác định bộ lọc truy vấn. Đường ống tổng hợp cung cấp cho nhà điều hành
db.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
8 để thể hiện các câu lệnh có điều kiện. Bằng cách sử dụng $expr với toán tửdb.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
8, bạn có thể chỉ định một bộ lọc có điều kiện cho câu lệnh truy vấn của mình.$expr with thedb.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
8 operator, you can specify a conditional filter for your query statement.Tạo bộ sưu tập mẫu
{ "_id" : 1, "category" : "food", "budget" : 400, "spent" : 450 } |
{ "_id" : 2, "category" : "drinks", "budget" : 100, "spent" : 150 } |
{ "_id" : 5, "category" : "travel", "budget" : 200, "spent" : 650 } |
db.supplies.insertMany([ |
{ "_id" : 1, "item" : "binder", "qty" : NumberInt("100"), "price" : NumberDecimal("12") }, |
{ "_id" : 2, "item" : "notebook", "qty" : NumberInt("200"), "price" : NumberDecimal("8") }, |
{ "_id" : 3, "item" : "pencil", "qty" : NumberInt("50"), "price" : NumberDecimal("6") }, |
{ "_id" : 4, "item" : "eraser", "qty" : NumberInt("150"), "price" : NumberDecimal("3") }, |
{ "_id" : 5, "item" : "legal pad", "qty" : NumberInt("42"), "price" : NumberDecimal("10") } |
]) |
Giả sử rằng đối với việc bán hàng sắp tới vào tháng tới, bạn muốn giảm giá như vậy:
Nếu
2 lớn hơn hoặc bằng 100, giá chiết khấu sẽ là 0,5 của{ "_id" : 1, "category" : "food", "budget" : 400, "spent" : 450 } { "_id" : 2, "category" : "drinks", "budget" : 100, "spent" : 150 } { "_id" : 5, "category" : "travel", "budget" : 200, "spent" : 650 }
3.{ "_id" : 1, "category" : "food", "budget" : 400, "spent" : 450 } { "_id" : 2, "category" : "drinks", "budget" : 100, "spent" : 150 } { "_id" : 5, "category" : "travel", "budget" : 200, "spent" : 650 } Nếu
2 nhỏ hơn 100, giá chiết khấu là 0,75 của{ "_id" : 1, "category" : "food", "budget" : 400, "spent" : 450 } { "_id" : 2, "category" : "drinks", "budget" : 100, "spent" : 150 } { "_id" : 5, "category" : "travel", "budget" : 200, "spent" : 650 }
3.{ "_id" : 1, "category" : "food", "budget" : 400, "spent" : 450 } { "_id" : 2, "category" : "drinks", "budget" : 100, "spent" : 150 } { "_id" : 5, "category" : "travel", "budget" : 200, "spent" : 650 }
Trước khi áp dụng giảm giá, bạn muốn biết mục nào trong bộ sưu tập
{ "_id" : 1, "category" : "food", "budget" : 400, "spent" : 450 } |
{ "_id" : 2, "category" : "drinks", "budget" : 100, "spent" : 150 } |
{ "_id" : 5, "category" : "travel", "budget" : 200, "spent" : 650 } |
{ "_id" : 1, "category" : "food", "budget" : 400, "spent" : 450 } |
{ "_id" : 2, "category" : "drinks", "budget" : 100, "spent" : 150 } |
{ "_id" : 5, "category" : "travel", "budget" : 200, "spent" : 650 } |
Ví dụ sau sử dụng $expr với
db.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
8 để tính giá chiết khấu dựa trên{ "_id" : 1, "category" : "food", "budget" : 400, "spent" : 450 } |
{ "_id" : 2, "category" : "drinks", "budget" : 100, "spent" : 150 } |
{ "_id" : 5, "category" : "travel", "budget" : 200, "spent" : 650 } |
{ "_id" : 1, "category" : "food", "budget": 400, "spent": 450 } |
{ "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 } |
{ "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 } |
{ "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 } |
{ "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 } |
db.supplies.insertMany([ |
{ "_id" : 1, "item" : "binder", "qty" : NumberInt("100"), "price" : NumberDecimal("12") }, |
{ "_id" : 2, "item" : "notebook", "qty" : NumberInt("200"), "price" : NumberDecimal("8") }, |
{ "_id" : 3, "item" : "pencil", "qty" : NumberInt("50"), "price" : NumberDecimal("6") }, |
{ "_id" : 4, "item" : "eraser", "qty" : NumberInt("150"), "price" : NumberDecimal("3") }, |
{ "_id" : 5, "item" : "legal pad", "qty" : NumberInt("42"), "price" : NumberDecimal("10") } |
]) |
db.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
8 to calculate the discounted price based on the{ "_id" : 1, "category" : "food", "budget" : 400, "spent" : 450 } |
{ "_id" : 2, "category" : "drinks", "budget" : 100, "spent" : 150 } |
{ "_id" : 5, "category" : "travel", "budget" : 200, "spent" : 650 } |
{ "_id" : 1, "category" : "food", "budget": 400, "spent": 450 } |
{ "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 } |
{ "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 } |
{ "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 } |
{ "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 } |
db.supplies.insertMany([ |
{ "_id" : 1, "item" : "binder", "qty" : NumberInt("100"), "price" : NumberDecimal("12") }, |
{ "_id" : 2, "item" : "notebook", "qty" : NumberInt("200"), "price" : NumberDecimal("8") }, |
{ "_id" : 3, "item" : "pencil", "qty" : NumberInt("50"), "price" : NumberDecimal("6") }, |
{ "_id" : 4, "item" : "eraser", "qty" : NumberInt("150"), "price" : NumberDecimal("3") }, |
{ "_id" : 5, "item" : "legal pad", "qty" : NumberInt("42"), "price" : NumberDecimal("10") } |
]) |
// Aggregation expression to calculate discounted price |
let discountedPrice = { |
$cond: { |
if: { $gte: ["$qty", 100] }, |
then: { $multiply: ["$price", NumberDecimal("0.50")] }, |
else: { $multiply: ["$price", NumberDecimal("0.75")] } |
} |
}; |
// Query the supplies collection using the aggregation expression |
db.supplies.find( { $expr: { $lt:[ discountedPrice, NumberDecimal("5") ] } }); |
Bảng sau đây cho thấy giá chiết khấu cho mỗi tài liệu và liệu giá chiết khấu có nhỏ hơn
db.supplies.insertMany([ |
{ "_id" : 1, "item" : "binder", "qty" : NumberInt("100"), "price" : NumberDecimal("12") }, |
{ "_id" : 2, "item" : "notebook", "qty" : NumberInt("200"), "price" : NumberDecimal("8") }, |
{ "_id" : 3, "item" : "pencil", "qty" : NumberInt("50"), "price" : NumberDecimal("6") }, |
{ "_id" : 4, "item" : "eraser", "qty" : NumberInt("150"), "price" : NumberDecimal("3") }, |
{ "_id" : 5, "item" : "legal pad", "qty" : NumberInt("42"), "price" : NumberDecimal("10") } |
]) |
{"_id": 1, "Mục": "Binder", "Qty": 100, "Giá": NumberDecimal ("12")} | NumberDecimal("6.00") |
| |||||||
{"_id": 2, "Mục": "Noteboook", "Qty": 200, "Giá": NumberDecimal ("8")} | NumberDecimal("4.00") |
| |||||||
{"_id": 3, "vật phẩm": "bút chì", "qty": 50, "giá": numberdecimal ("6")} | NumberDecimal("4.50") |
| |||||||
{"_id": 4, "Mục": "Eraser", "Qty": 150, "Giá": NumberDecimal ("3")} | NumberDecimal("1.50") |
| |||||||
{"_id": 5, "Mục": "Pad hợp pháp", "Qty": 42, "Giá": NumberDecimal ("10")} | NumberDecimal("7.50") |
|
Hoạt động
db.supplies.insertMany([ |
{ "_id" : 1, "item" : "binder", "qty" : NumberInt("100"), "price" : NumberDecimal("12") }, |
{ "_id" : 2, "item" : "notebook", "qty" : NumberInt("200"), "price" : NumberDecimal("8") }, |
{ "_id" : 3, "item" : "pencil", "qty" : NumberInt("50"), "price" : NumberDecimal("6") }, |
{ "_id" : 4, "item" : "eraser", "qty" : NumberInt("150"), "price" : NumberDecimal("3") }, |
{ "_id" : 5, "item" : "legal pad", "qty" : NumberInt("42"), "price" : NumberDecimal("10") } |
]) |
db.supplies.insertMany([ |
{ "_id" : 1, "item" : "binder", "qty" : NumberInt("100"), "price" : NumberDecimal("12") }, |
{ "_id" : 2, "item" : "notebook", "qty" : NumberInt("200"), "price" : NumberDecimal("8") }, |
{ "_id" : 3, "item" : "pencil", "qty" : NumberInt("50"), "price" : NumberDecimal("6") }, |
{ "_id" : 4, "item" : "eraser", "qty" : NumberInt("150"), "price" : NumberDecimal("3") }, |
{ "_id" : 5, "item" : "legal pad", "qty" : NumberInt("42"), "price" : NumberDecimal("10") } |
]) |
{ "_id" : 2, "item" : "notebook", "qty": 200 , "price": NumberDecimal("8") } |
{ "_id" : 3, "item" : "pencil", "qty": 50 , "price": NumberDecimal("6") } |
{ "_id" : 4, "item" : "eraser", "qty": 150 , "price": NumberDecimal("3") } |
Mặc dù
db.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
8 tính toán giá chiết khấu hiệu quả, giá đó không được phản ánh trong các tài liệu trả lại. Thay vào đó, các tài liệu được trả lại đại diện cho các tài liệu phù hợp ở trạng thái ban đầu của chúng. Hoạt động tìm thấy không trả lại các tài liệu// Aggregation expression to calculate discounted price |
let discountedPrice = { |
$cond: { |
if: { $gte: ["$qty", 100] }, |
then: { $multiply: ["$price", NumberDecimal("0.50")] }, |
else: { $multiply: ["$price", NumberDecimal("0.75")] } |
} |
}; |
// Query the supplies collection using the aggregation expression |
db.supplies.find( { $expr: { $lt:[ discountedPrice, NumberDecimal("5") ] } }); |
// Aggregation expression to calculate discounted price |
let discountedPrice = { |
$cond: { |
if: { $gte: ["$qty", 100] }, |
then: { $multiply: ["$price", NumberDecimal("0.50")] }, |
else: { $multiply: ["$price", NumberDecimal("0.75")] } |
} |
}; |
// Query the supplies collection using the aggregation expression |
db.supplies.find( { $expr: { $lt:[ discountedPrice, NumberDecimal("5") ] } }); |
{ "_id" : 1, "category" : "food", "budget" : 400, "spent" : 450 } |
{ "_id" : 2, "category" : "drinks", "budget" : 100, "spent" : 150 } |
{ "_id" : 5, "category" : "travel", "budget" : 200, "spent" : 650 } |