sql >> Database >  >> NoSQL >> MongoDB

mongoDB:hoe $unwind terug te draaien

Er is een bepaalde truc voor hoe dit wordt afgehandeld, maar ten eerste, als je MongoDB 2.6 of hoger beschikbaar hebt, kun je echt doen wat je wilt zonder $unwind . Dit kan erg handig zijn voor de prestaties als u veel documenten verwerkt.

De belangrijkste operators hier zijn $map die arrays op hun plaats verwerkt en de $allElementsTrue operator die uw "resultaat" -velden zal evalueren. Het gebruik van "map" hier maakt het mogelijk om zowel de binnenste "tests"-array te testen om te zien waar de "result"-velden daar allemaal aan de werkelijke voorwaarde voldoen. In het geval van de buitenste array kan dit "resultaat" naar wens in die documenten worden geplaatst, en natuurlijk volgt de volledige evaluatie van het document dezelfde regels:

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

De manier om dit in eerdere versies te doen, vereist dat u $group terug in twee stappen om de arrays te "herbouwen" terwijl de tests op die "resultaat" -velden opnieuw worden uitgevoerd. Het andere verschil hier is ook het gebruik van de $min operator als false wordt beschouwd als een lagere waarde dan true en evalueert naar hetzelfde "allElements"-concept:

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. Gebruik van QueryBuilder en BasicDBObjectBuilder in MongoDB 3.3.0 hierboven

  2. Mongodb voegt een nieuw veld toe in een bestaand document, met een specifieke positie

  3. Hoe voeg ik een element toe aan de interne lijst van MongoDB?

  4. Herhaal alle Mongo-databases