MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak wysłać zapytanie o klucz dynamiczny — projektowanie schematu mongodb

Korzystanie z MongoDB 3.4.4 i nowszych wersji:

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

Powyższy potok da ostateczny wynik

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

Wyjaśnienia

Potok można rozłożyć, aby pokazać wyniki poszczególnych operatorów.

$objectToArray

$objectToArray umożliwia przekształcenie dokumentu głównego za pomocą kluczy dynamicznych (oznaczonych zmienną systemową $$ROOT ) do tablicy zawierającej element dla każdej pary pole/wartość w oryginalnym dokumencie. Każdy element w tablicy return jest dokumentem zawierającym dwa pola k i v. Uruchamianie potoku tylko z operatorem w $project scena

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

plony

{
    "_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 Operator działa jako mechanizm filtrujący dla tablicy tworzonej przez $objectToArray operator, działa poprzez wybranie podzbioru tablicy do zwrócenia na podstawie określonego warunku, który staje się zapytaniem.

Rozważmy następujący potok, który zwraca tablicę pary klucz/wartość, która pasuje do warunku { "samekeyA": "value1" }

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

co daje

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

$arrayToObject

Spowoduje to przekształcenie filtrowanej tablicy powyżej z

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

do oryginalnego dokumentu za pomocą klawisza dynamicznego

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

więc uruchamianie potoku

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

wyprodukuje

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

$replaceRoot

Spowoduje to awans przefiltrowanego dokumentu z kluczem dynamicznym na najwyższy poziom i zastąpienie wszystkich innych pól. Operacja zastępuje wszystkie istniejące pola w dokumencie wejściowym, w tym _id pole.

Zasadniczo przekształca to powyższy dokument

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

do pożądanego wyjścia końcowego

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Sortowanie rekordów w taki sposób, aby tylko rekordy pasujące do identyfikatora były na pierwszym miejscu?

  2. Węzeł + Mongusta:Czy pobrano ostatnio wstawiony identyfikator?

  3. MongoDb sortuj kolekcję według liczby w innej kolekcji

  4. Nie można uruchomić MongoDB. BŁĄD:adres jest już używany

  5. MongoDB:Sortuj według indeksu tablicy