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

mongoDB:cara membalikkan $unwind

Ada trik khusus tentang cara menanganinya, tetapi pertama-tama jika Anda memiliki MongoDB 2.6 atau lebih tinggi yang tersedia maka Anda dapat benar-benar melakukan apa yang Anda inginkan tanpa menggunakan $unwind . Ini bisa sangat berguna untuk kinerja jika Anda memproses banyak dokumen.

Operator kunci di sini adalah $map yang memproses array di tempat dan $allElementsTrue operator yang akan mengevaluasi bidang "hasil" Anda. Penggunaan "peta" di sini memungkinkan pengujian larik "tes" dalam untuk melihat di mana bidang "hasil" di sana semuanya memenuhi kondisi yang sebenarnya. Dalam kasus larik luar, "hasil" ini dapat ditempatkan ke dalam dokumen tersebut sesuai kebutuhan Anda, dan tentu saja evaluasi penuh untuk dokumen mengikuti aturan yang sama:

db.test.aggregate([
    { "$project": {
        "name": 1,
        "result": {
            "$allElementsTrue": {
                "$map": {
                    "input": "$acts",
                    "as": "act",
                    "in": {
                        "$allElementsTrue": {
                            "$map": {
                                 "input": "$$act.tests",
                                 "as": "test",
                                 "in": "$$test.result"
                            }
                        }
                    }
                }
            }
        },
        "acts": {
            "$map": {
                 "input": "$acts",
                 "as": "act",
                 "in": {
                    "name": "$$act.name",
                    "result": {
                        "$allElementsTrue": {
                            "$map": {
                                "input": "$$act.tests",
                                "as": "test",
                                "in": "$$test.result"
                            }
                        }
                    },
                    "tests": "$$act.tests"
                 }
            }
        }
    }}
])

Cara melakukannya di versi sebelumnya mengharuskan Anda untuk $group kembali dalam dua langkah untuk "membangun kembali" array saat melakukan tes pada bidang "hasil" itu lagi. Perbedaan lain di sini juga menggunakan $min operator sebagai false akan dianggap sebagai nilai yang lebih rendah dari true dan mengevaluasi konsep "allElements" yang sama:

db.test.aggregate([
    { "$unwind": "$acts" },
    { "$unwind": "$acts.tests" },
    { "$group": {
        "_id": {
            "_id": "$_id",
            "name": "$name",
            "actName": "$acts.name"
        },
        "result": { "$min": "$acts.tests.result" },
        "tests": {
           "$push": {
               "name": "$acts.tests.name",
               "result": "$acts.tests.result"
           }
        }
    }},
    { "$group": {
        "_id": "$_id._id",
        "name": { "$first": "$_id.name" },
        "result": { "$min": "$result" },
        "acts": {
            "$push": {
                "name": "$_id.actName",
                "result": "$result",
                "tests": "$tests"
            }
        }
    }}
])



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Masalah Agregat &Pengelompokan MongoDB di MeteorJS

  2. Operasi pembaruan Mongodb di dalam sub array

  3. Kesalahan koneksi Mongodb di dalam wadah buruh pelabuhan

  4. MongoDB $inc

  5. Dapatkan Nama Bulan dari Tanggal di SQL