Khá về câu hỏi cũ nhưng theo nghĩa đen thì không có câu trả lời nào được đề xuất là tốt.
TLDR :
Bạn không thể sử dụng $ elemMatch trong giai đoạn $ project. nhưng bạn có thể đạt được kết quả tương tự bằng cách sử dụng các toán tử tổng hợp khác như $ filter.
db.itens.aggregate([
{
$project: {
compList: {
$filter: {
input: "$complist",
as: "item",
cond: {$eq: ["$$item.a", 1]}
}
}
}
}
])
Và nếu bạn chỉ muốn mục đầu tiên từ mảng phù hợp với điều kiện tương tự như $ elemMatch, bạn có thể kết hợp $ arrayElemAt
Giải thích chuyên sâu :
Trước tiên, hãy hiểu về $ elemMatch:
$ elemMatch là một biểu thức truy vấn trong khi phiên bản chiếu này của nó cũng tồn tại, nó đề cập đến một phép chiếu truy vấn chứ không phải giai đoạn tổng hợp $ dự án.
Vậy thì sao? cái này có liên quan gì đến cái gì không giai đoạn $ project có cấu trúc đầu vào nhất định mà nó có thể có trong khi giai đoạn chúng tôi muốn sử dụng là:
:
Biểu thức hợp lệ là gì?
Biểu thức có thể bao gồm các đường dẫn trường, các ký tự, các biến hệ thống, các đối tượng biểu thức và các toán tử biểu thức. Các biểu thức có thể được lồng vào nhau.
Vì vậy, chúng tôi muốn sử dụng một toán tử biểu thức, nhưng như bạn có thể thấy từ $elemMatch
của tài liệu không phải là một phần của nó. do đó, nó không phải là một biểu thức hợp lệ để được sử dụng trong một tập hợp $project
sân khấu.