sql >> Database teknologi >  >> NoSQL >> MongoDB

Sådan forespørges en dynamisk nøgle - mongodb skemadesign

Brug af MongoDB 3.4.4 og nyere versioner:

db.coll.aggregate([
    { "$replaceRoot": {
        "newRoot": {
            "$arrayToObject": {
                "$filter": {
                    "input": { "$objectToArray": "$$ROOT" },
                    "as": "el",
                    "cond": {
                        "$eq": [
                            "$$el.v.samekeyA",
                            "value1"
                        ]
                    }
                }
            }
        }   
    } }
])

Ovenstående pipeline vil give det endelige output

{
    "key1" : {
        "samekeyA" : "value1",
        "samekeyB" : "value2"
    }
}

Forklaringer

Rørledningen kan dekomponeres for at vise hver enkelt operatørs resultater.

$objectToArray

$objectToArray giver dig mulighed for at transformere roddokumentet med dynamiske nøgler (angivet med systemvariablen $$ROOT ) i et array, der indeholder et element for hvert felt/værdipar i det originale dokument. Hvert element i returarrayet er et dokument, der indeholder to felter k og v. Kører pipelinen med kun operatøren i en $project scenen

db.coll.aggregate([
    { "$project": {
        "keys": { "$objectToArray": "$$ROOT" }
    } }
])

udbytte

{
    "_id" : 1,
    "keys" : [ 
        {
            "k" : "_id",
            "v" : 1
        }, 
        {
            "k" : "key1",
            "v" : {
                "samekeyA" : "value1",
                "samekeyB" : "value2"
            }
        }, 
        {
            "k" : "key2",
            "v" : {
                "samekeyA" : "value3",
                "samekeyB" : "value4"
            }
        }, 
        {
            "k" : "key3",
            "v" : {
                "samekeyA" : "value5",
                "samekeyB" : "value6"
            }
        }
    ]
}

$filter

$filter operatøren fungerer som en filtreringsmekanisme for arrayet produceret af $objectToArray operator, fungerer ved at vælge en delmængde af arrayet, der skal returneres baseret på den angivne betingelse, som bliver din forespørgsel.

Overvej følgende pipeline, som returnerer en matrix af nøgle/værdi-parret, der matcher betingelsen { "samekeyA": "value1" }

db.coll.aggregate([
    { "$project": {
        "keys": { 
            "$filter": {
                "input": { "$objectToArray": "$$ROOT" },
                "as": "el",
                "cond": {
                    "$eq": [
                        "$$el.v.samekeyA",
                        "value1"
                    ]
                }
            }  
        }
    } }
])

hvilket giver

{
    "_id" : 1,
    "keys" : [ 
        {
            "k" : "key1",
            "v" : {
                "samekeyA" : "value1",
                "samekeyB" : "value2"
            }
        }
    ]
}

$arrayToObject

Dette vil transformere det filtrerede array ovenfor fra

[ 
    {
        "k" : "key1",
        "v" : {
            "samekeyA" : "value1",
            "samekeyB" : "value2"
        }
    }
]

til det originale dokument med den dynamiske nøgle

{
    "key1" : {
        "samekeyA" : "value1",
        "samekeyB" : "value2"
    }
}

så kører pipelinen

db.coll.aggregate([
    { "$project": {
        "key": {
            "$arrayToObject": {
                "$filter": {
                    "input": { "$objectToArray": "$$ROOT" },
                    "as": "el",
                    "cond": {
                        "$eq": [
                            "$$el.v.samekeyA",
                            "value1"
                        ]
                    }
                }
            }
        }   
    } }
])

vil producere

{
    "_id" : 1,
    "key" : {
        "key1" : {
            "samekeyA" : "value1",
            "samekeyB" : "value2"
        }
    }
}

$replaceRoot

Dette vil fremme det filtrerede dynamiske nøgledokument til det øverste niveau og erstatter alle andre felter. Handlingen erstatter alle eksisterende felter i inputdokumentet, inklusive _id Mark.

Dette transformerer i det væsentlige ovenstående dokument

{
    "_id" : 1,
    "key" : {
        "key1" : {
            "samekeyA" : "value1",
            "samekeyB" : "value2"
        }
    }
}

til det ønskede endelige output

{
    "key1" : {
        "samekeyA" : "value1",
        "samekeyB" : "value2"
    }
}


  1. Forespørgsel i indlejrede indlejrede dokumenter med Mongoose

  2. Mongoose TypeError:Kan ikke bruge 'in' operator til at søge efter '_id' i [object Object]

  3. Metode fungerer i udvikling, men ikke produktion Rails MongoDB

  4. nodejs viser billede gemt i gridFS til html