PERBARUI: Dimulai dengan MongoDB v4.1.11, akhirnya tampaknya ada solusi yang bagus untuk masalah Anda yang didokumentasikan di sini .
Jawaban awal:
Seperti yang saya tulis di komentar di atas, $regex
tidak berfungsi di dalam $cond
seperti yang sekarang. Ada tiket JIRA
yang terbuka untuk itu tapi, err, yah, buka...
Dalam kasus spesifik Anda, saya cenderung menyarankan Anda menyelesaikan topik itu di sisi klien kecuali jika Anda berurusan dengan jumlah data input yang gila di mana Anda hanya akan selalu mengembalikan sebagian kecil. Dilihat dari kueri Anda, tampaknya Anda akan selalu mengambil semua dokumen yang baru saja dimasukkan ke dalam dua grup hasil ("Ya" dan "Tidak").
Jika Anda tidak ingin atau tidak dapat menyelesaikan topik itu di sisi klien, maka berikut adalah sesuatu yang menggunakan $facet (MongoDB>=v3.4 diperlukan) - ini tidak terlalu cepat atau terlalu cantik tetapi mungkin membantu Anda untuk memulai.
db.captions.aggregate([{
$facet: { // create two stages that will be processed using the full input data set from the "captions" collection
"CallToActionYes": [{ // the first stage will...
$match: { // only contain documents...
"plainText": /leave\sa\scomment/i // that are allowed by the $regex filter (which could be extended with multiple $or expressions or changed to $in/$nin which accept regular expressions, too)
}
}, {
$addFields: { // for all matching documents...
"CallToAction": "Yes" // we create a new field called "CallsToAction" which will be set to "Yes"
}
}],
"CallToActionNo": [{ // similar as above except we're doing the inverse filter using $not
$match: {
"plainText": { $not: /leave\sa\scomment/i }
}
}, {
$addFields: {
"CallToAction": "No" // and, of course, we set the field to "No"
}
}]
}
}, {
$project: { // we got two arrays of result documents out of the previous stage
"allDocuments" : { $setUnion: [ "$CallToActionYes", "$CallToActionNo" ] } // so let's merge them into a single one called "allDocuments"
}
}, {
$unwind: "$allDocuments" // flatten the "allDocuments" result array
}, {
$replaceRoot: { // restore the original document structure by moving everything inside "allDocuments" up to the top
newRoot: "$allDocuments"
}
}, {
$project: { // include only the two relevant fields in the output (and the _id)
"videoId": 1,
"CallToAction": 1
}
}])
Seperti biasa dengan kerangka kerja agregasi, mungkin membantu untuk menghapus tahapan individual dari akhir pipeline dan menjalankan kueri parsial untuk mendapatkan pemahaman tentang apa yang dilakukan setiap tahapan.