Điều này có nghĩa là nếu bạn đang sử dụng các biến đầu vào trong $ lookuppipeline, bạn phải sử dụng $ expr
Đúng, theo mặc định trong các bộ lọc, tức là; trong phần bộ lọc của .find()
hoặc trong $match
giai đoạn tổng hợp, bạn không thể sử dụng trường hiện có trong tài liệu.
Nếu hoàn toàn, nếu bạn cần sử dụng giá trị của trường hiện có trong bộ lọc truy vấn của mình thì bạn cần sử dụng đường dẫn tổng hợp, Vì vậy, để sử dụng đường dẫn tổng hợp trong .find()
hoặc trong $match
bạn cần kết hợp truy vấn bộ lọc của mình bằng $ expr. Cùng một cách để truy cập các biến cục bộ đã được tạo bằng cách sử dụng let
trong tổng số $lookup
lọc trong $match
cần được bao bọc bởi $expr
.
Hãy xem xét ví dụ dưới đây:
Tài liệu mẫu:
[
{
"key": 1,
"value": 2
},
{
"key": 2,
"value": 4
},
{
"key": 5,
"value": 5
}
]
Truy vấn:
db.collection.find({ key: { $gt: 1 }, value: { $gt: 4 } })
Or
db.collection.aggregate([ { $match: { key: { $gt: 1 }, value: { $gt: 4 } } } ])
Kiểm tra: mongoplayground
Nếu bạn thấy truy vấn trên, cả hai đầu vào 1
&4
được chuyển vào truy vấn nhưng bạn kiểm tra truy vấn bên dưới nơi bạn cố gắng khớp với key
trường ==value
trường - nó không hoạt động:
db.collection.aggregate([ { $match: { key: { $eq: "$value" } } } ])
Kiểm tra: mongoplayground
Ở trên khi bạn đang so sánh hai trường hiện có thì bạn không thể làm điều đó vì điều đó có nghĩa là bạn đang kiểm tra tài liệu bằng key
giá trị trường dưới dạng chuỗi "$value"
. Vì vậy, để nói rằng nó không phải là một chuỗi, nó thực sự là một tham chiếu đến giá trị value
trường bạn cần sử dụng toán tử tổng hợp $ eq thay vì toán tử truy vấn $ eq như bên dưới:
db.collection.aggregate([ { $match: { $expr: { $eq: [ "$key", "$value" ] } } } ])
Kiểm tra: mongoplayground