Cukup pada pertanyaan lama tetapi secara harfiah tidak ada jawaban yang diajukan yang bagus.
TLDR :
Anda tidak dapat menggunakan $elemMatch dalam tahap $project. tetapi Anda dapat mencapai hasil yang sama menggunakan operator agregasi lain seperti $filter.
db.itens.aggregate([
{
$project: {
compList: {
$filter: {
input: "$complist",
as: "item",
cond: {$eq: ["$$item.a", 1]}
}
}
}
}
])
Dan jika Anda hanya menginginkan item pertama dari larik yang cocok dengan kondisi yang mirip dengan apa yang dilakukan $elemMatch, Anda dapat memasukkan $arrayElemAt
Penjelasan Mendalam :
Pertama mari kita pahami $elemMatch:
$elemMatch adalah ekspresi kueri sementara juga versi proyeksi ini ada, ini mengacu pada proyeksi kueri dan bukan tahap agregasi $project.
Terus? apa ini ada hubungannya? baik tahap $project memiliki struktur input tertentu yang dapat dimiliki sedangkan yang ingin kita gunakan adalah:
:
Apa itu ekspresi yang valid?
Ekspresi dapat mencakup jalur bidang, literal, variabel sistem, objek ekspresi, dan operator ekspresi. Ekspresi dapat disarangkan.
Jadi kami ingin menggunakan operator ekspresi, tetapi seperti yang Anda lihat dari $elemMatch
dokumen bukan bagian darinya. maka itu bukan ekspresi yang valid untuk digunakan dalam agregasi $project
panggung.