Załóżmy, że mam następującą strukturę:

"KnownName" : {
    "unknownName1" : {
        "id" : "unknownName1",
        "value" : "5"
    },
    "unknownName2" : {
        "id" : "unknownName2",
        "value" : "5"
    },
    "unknownName3" : {
        "id" : "unknownName3",
        "value" : "5"
    },
    "unknownName4" : {
        "id" : "unknownName4",
        "value" : "5"
    },
    "unknownName5" : {
        "id" : "unknownName5_v2",
        "value" : "5"
    },
    "unknownName6" : {
        "id" : "unknownName6",
        "value" : "5"
    }

... many more documents as above in various ways

I chcę, żeby to wszystko było liczone w ten sposób:

unknownName1 : 24
unknownName2 : 27
unknownName3 : 10
....
unknownName37 : 12

Znam moją strukturę w węźle „KnownName”, ale w tym węźle mogę mieć kilka różnych etykiet (tutaj unknownName od 1 do 6), ale może być ich mniej lub więcej i mogą się różnić w zależności od dokumentu. Zazwyczaj identyfikator w tablicy będzie miał taką samą nazwę jak etykieta tablicy, ale nie jest podany (jak w unknownName5).

Szukałem sposobów, aby uzyskać wyraźną liczbę wszystkich tych „nieznanych nazw”, ale wydaje się to być trudniejsze, jak się spodziewałem.

Wszelkie porady dotyczące sposobu, w jaki można to osiągnąć (najlepiej przy użyciu ram agregacji)

Jeśli istnieje prosty sposób na uzyskanie wszystkich (głębokich) dzieci oznaczonych jako "id" w drzewie "KnownName" bez konieczności znajomości nieznanego imienia rodzica, to zadziała również dla mnie. Wiem, że w mongo nie ma czegoś takiego jak symbole wieloznaczne, ale szukam alternatywy dla czegoś takiego jak KnownName.*.id

0
Wokoman 1 listopad 2018, 15:47

1 odpowiedź

Najlepsza odpowiedź

Musisz zacząć od $objectToArray od twoich kluczy są nieznane. Następnie otrzymasz tablicę kluczy i wartości, które można przetworzyć za pomocą $grupa, aby uzyskać liczenia. Możesz także użyć $replaceRoot i $arrayToObject, aby uzyskać klucze dynamiczne w obiekcie głównym

db.col.aggregate([
    {
        $addFields: {
            unknown: { $objectToArray: "$KnownName" }
        }
    },
    {
        $unwind: "$unknown"
    },
    {
        $group: {
            _id: "$unknown.k",
            count: { $sum: 1 }
        }
    },
    {
        $sort: { _id: 1 }
    },
    {
        $group: {
            _id: null,
            data: { $push: { k: "$_id", v: "$count" } }
        }
    },
    {
        $replaceRoot: {
            newRoot: {
                $arrayToObject: "$data"
            }
        }
    }
])
1
mickl 1 listopad 2018, 15:58