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
}
}
])