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

Cara menggunakan $in atau $nin dalam agregasi mongo $group $cond

Perbandingan di $setIsSubset adalah opsi yang lebih pendek daripada $or kondisi yang Anda gunakan, meskipun pada dasarnya masih valid untuk melakukan apa yang Anda lakukan.

Satu-satunya tangkapan dengan $setIsSubset adalah bahwa setiap argumen adalah array sehingga Anda perlu mengonversi elemen tunggal sebagai array elemen tunggal. Ini cukup mudah menggunakan $map :

db.collectionName.aggregate([
    { "$group": {
        "_id": "$createdAt",
        "count": { "$sum": 1 },
        "count_failure": {
            "$sum": {
                "$cond": [
                    { "$setIsSubset": [
                        { "$map": {
                            "input": ["A"],
                            "as": "el",
                            "in": "$id"
                        }},
                        [ 0,100,101,102,103,104,105 ],
                    ]},
                    1,
                    0
                ]
            }
        }
    }}    
])

Atau jika Anda mau, cocokkan larik argumen dengan nilai tunggal, dengan $anyElementTrue :

db.collectionName.aggregate([
    { "$group": {
        "_id": "$createdAt",
        "count": { "$sum": 1 },
        "count_failure": {
            "$sum": {
                "$cond": [
                    { "$anyElementTrue": { "$map": {
                        "input": [ 0,100,101,102,103,104,105 ],
                        "as": "el",
                        "in": { "$eq": [ "$$el", "$id" ] }
                    }}},
                    1,
                    0
                ]
            }
        }
    }}
])

Dimana $map alih-alih melintasi argumen untuk dicocokkan dengan singular daripada memaksa singular menjadi array.

Dan tentu saja karena kedua formulir pada dasarnya memasok true/false ke $cond maka Anda bisa membalikkan logika dengan $not jika diperlukan:

db.collectionName.aggregate([
    { "$group": {
        "_id": "$createdAt",
        "count": { "$sum": 1 },
        "count_failure": {
            "$sum": {
                "$cond": [
                    { "$not": [{ "$anyElementTrue": { "$map": {
                        "input": [ 0,100,101,102,103,104,105 ],
                        "as": "el",
                        "in": { "$eq": [ "$$el", "$id" ] }
                    }}}]},
                    1,
                    0
                ]
            }
        }
    }}
])

Itu benar-benar tergantung pada bagaimana Anda melihatnya, tetapi hanya sebagai argumen yang diberikan maka Anda tidak benar-benar mendapatkan apa pun dari bentuk aslinya dengan $or . Ini mungkin terlihat sedikit lebih bersih dan "lebih mudah untuk diketik", tetapi biasanya saya tidak akan "mengetik" logika seperti itu ke dalam pipa agregasi secara langsung, melainkan menghasilkan bagian struktur itu berdasarkan daftar biasa di tempat pertama:

yaitu

var failList = [ 0,100,101,102,103,104,105 ];

var orCondition = failList.map(function(el) { 
    return { "$eq": [ "$id", el ] }
})

Dan kemudian hanya menggunakan konten array yang dipetakan ulang dalam definisi pipeline:

    { "$group": {
        "_id": "$createdAt",
        "count": { "$sum": 1 },
        "count_failure": {
            "$sum": {
                "$cond": [
                    { "$or": orCondition },
                    1,
                    0
                ]
            }
        }
    }}
])

Apapun cara Anda melihatnya, ingat itu semua hanya struktur data dan Anda memiliki proses dasar untuk memanipulasi. Baik di dalam pemrosesan pipa maupun di dalam konstruksi pipa itu sendiri.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. JSON.parse() setara dalam driver mongo 3.x untuk Java

  2. Dokumen unik dalam koleksi MongoDB

  3. Memvisualisasikan Topologi Cluster Anda di ClusterControl

  4. Meminta data yang dilokalkan di MongoDB

  5. Periksa otentikasi MongoDB dengan driver Java 3.0