Câu trả lời dưới đây sẽ trả về kết quả mong muốn của bạn. $match đầu tiên chỉ được sử dụng để lọc các tài liệu không có cat trong đó, với sự trợ giúp của text mục lục. Nếu bạn không sử dụng giai đoạn này, kết quả sẽ giống nhau và đúng nhưng có thể chậm hơn.
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
}
}
])