Jawaban di bawah ini akan mengembalikan hasil yang Anda inginkan. $match pertama hanya digunakan untuk memfilter dokumen tanpa cat di dalamnya, dengan bantuan text indeks. Jika Anda tidak menggunakan tahap ini, hasilnya akan sama dan benar tetapi mungkin lebih lambat.
db.pages.aggregate([
{
$match: {
$text: {
$search: "cat"
}
}
},
{
$unwind: '$articles'
},
{
$match: {
'articles.articleContent': /cat/
}
},
{
$group: {
_id: {
_id: '$_id',
pageNo: '$pageNo'
},
articles: {
$push: '$articles'
}
}
},
{
$project: {
_id: '$_id._id',
pageNo: '$_id.pageNo',
articles: 1
}
}
])