MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

MongoDB:Agregasi menggunakan $cond dengan $regex

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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. kesalahan mongoDB:Kesalahan:gagal terhubung ke [localhost:27017]

  2. MongoDB Banyak Indeks vs. Indeks Tunggal pada larik Sub-Dokumen?

  3. Bagaimana cara menggunakan penguncian optimis dengan Spring Data MongoDB?

  4. Memasukkan datetime saat ini di mongodb

  5. Menyesuaikan nama kacang repositori Spring Data untuk digunakan dengan banyak sumber data