sql >> Databáze >  >> NoSQL >> MongoDB

Jak se dotazovat na dynamický klíč - návrh schématu mongodb

Používání MongoDB 3.4.4 a novějších verzí:

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

Výše uvedené potrubí poskytne konečný výstup

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

Vysvětlení

Potrubí lze rozložit a zobrazit výsledky každého jednotlivého operátora.

$objectToArray

$objectToArray umožňuje transformovat kořenový dokument pomocí dynamických klíčů (označených systémovou proměnnou $$ROOT ) do pole, které obsahuje prvek pro každý pár pole/hodnota v původním dokumentu. Každý prvek v poli návratu je dokument, který obsahuje dvě pole k a v. Spuštění kanálu pouze s operátorem v $project etapa

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

výnosy

{
    "_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 operátor funguje jako filtrovací mechanismus pro pole vytvořené $objectToArray funguje tak, že vybere podmnožinu pole, která se má vrátit, na základě zadané podmínky, která se stane vaším dotazem.

Zvažte následující kanál, který vrací pole páru klíč/hodnota odpovídající podmínce { "samekeyA": "value1" }

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

který vynáší

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

$arrayToObject

Tím se transformuje filtrované pole výše z

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

do původního dokumentu pomocí dynamického klíče

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

tak běží potrubí

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

vyrobí

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

$replaceRoot

Tím povýšíte dokument filtrovaného dynamického klíče na nejvyšší úroveň a nahradíte všechna ostatní pole. Operace nahradí všechna existující pole ve vstupním dokumentu, včetně _id pole.

V podstatě to transformuje výše uvedený dokument

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

na požadovaný konečný výstup

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


  1. Sidekiq nenachází záznamy pro Rails Active Job

  2. Jak nasadit MongoDB pro vysokou dostupnost

  3. Mezipaměť Azure Redis – časové limity pro volání GET

  4. kanály bez kanálové vrstvy nebo jiného bezplatného hostingu