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 { "_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 } |
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 } |
0 stage.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 } |
0 là một phần của 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 } |
2, $expr có thể so sánh các trường sử dụng các biế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 } |
4. Xem thực hiện nhiều lần tham gia và một truy vấn con tương quan với { "_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 } |
2 cho một ví dụ.$expr can compare fields using { "_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 } |
4 variables. See Perform Multiple Joins and a Correlated Subquery with { "_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 } |
2 for an example.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 } |
6, { "_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 } |
7, { "_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 } |
8, { "_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 } |
9 và 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ập db.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 } |
2. Hạn chế:$expr operator can use an index on the 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 } |
2 stage. Limitations: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 the db.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
6 amount exceeds the db.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 the db.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 } |
1 với các tài liệu sau: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 { "_id" : 1, "category" : "food", "budget" : 400, "spent" : 450 } | { "_id" : 2, "category" : "drinks", "budget" : 100, "spent" : 150 } | { "_id" : 5, "category" : "travel", "budget" : 200, "spent" : 650 } |
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.Nế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 } |
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.
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 } |
1 có giá giảm giá thấp hơ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 } |
7.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 } |
2 và { "_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 } |
7 để trả lại các tài liệu có giá chiết khấu tính toán 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") } | ]) |
2:$expr with 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 } |
2 and { "_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 } |
7 to return
documents whose calculated discount price is less than 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") } | ]) |
2:// 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") } | ]) |
2 (nghĩa là liệu tài liệu có đáp ứng điều kiện truy vấn hay không).
Tài liệu | Giá giảm giá | < NumberDecimal("5") |
---|
{"_id": 1, "Mục": "Binder", "Qty": 100, "Giá": NumberDecimal ("12")}
| NumberDecimal("6.00")
| 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") } | ]) |
4
| {"_id": 2, "Mục": "Noteboook", "Qty": 200, "Giá": NumberDecimal ("8")}
| NumberDecimal("4.00")
| 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") } | ]) |
5
| {"_id": 3, "vật phẩm": "bút chì", "qty": 50, "giá": numberdecimal ("6")}
| NumberDecimal("4.50")
| 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") } | ]) |
5
| {"_id": 4, "Mục": "Eraser", "Qty": 150, "Giá": NumberDecimal ("3")}
| NumberDecimal("1.50")
| 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") } | ]) |
5
| {"_id": 5, "Mục": "Pad hợp pháp", "Qty": 42, "Giá": NumberDecimal ("10")}
| NumberDecimal("7.50")
| 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") } | ]) |
4
|
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") } | ]) |
9 trả về các tài liệu có giá chiết khấu tính toán 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") } | ]) |
2:{ "_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") ] } }); |
2 hoặc // 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") ] } }); |
3, vì giá chiết khấu của chúng lớn hơ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 } |
7. |