sql >> Database >  >> NoSQL >> MongoDB

Een dynamische sleutel opvragen - mongodb-schemaontwerp

MongoDB 3.4.4 en nieuwere versies gebruiken:

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

De bovenstaande pijplijn zal de uiteindelijke output opleveren

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

Uitleg

De pijplijn kan worden ontleed om de resultaten van elke individuele operator weer te geven.

$objectToArray

$objectToArray stelt u in staat om het hoofddocument te transformeren met dynamische sleutels (aangegeven door de systeemvariabele $$ROOT ) in een array die een element bevat voor elk veld/waarde-paar in het originele document. Elk element in de return-array is een document dat twee velden k en v bevat. De pijplijn uitvoeren met alleen de operator in een $project podium

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

opbrengsten

{
    "_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

De $filter operator fungeert als een filtermechanisme voor de array die wordt geproduceerd door de $objectToArray operator, werkt door een subset van de array te selecteren die moet worden geretourneerd op basis van de opgegeven voorwaarde die uw query wordt.

Overweeg de volgende pijplijn die een array retourneert van het sleutel/waarde-paar dat overeenkomt met de voorwaarde { "samekeyA": "value1" }

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

wat oplevert

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

$arrayToObject

Dit zal de gefilterde array hierboven transformeren van

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

naar het originele document met de dynamische sleutel

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

dus de pijplijn runnen

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

zal produceren

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

$replaceRoot

Hierdoor wordt het gefilterde dynamische sleuteldocument naar het hoogste niveau gepromoveerd en worden alle andere velden vervangen. De bewerking vervangt alle bestaande velden in het invoerdocument, inclusief de _id veld.

In wezen transformeert dit het bovenstaande document

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

naar de gewenste einduitvoer

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


  1. Verzamel en update MongoDB

  2. Vereisten voor het gebruik van MongoDB-transacties

  3. mongodb:tijdstempel uit ObjectID halen in json-query

  4. Kan externe mongodb-server niet verbinden met django/djongo