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

sortuj tablicę w zapytaniu i wyświetlaj wszystkie pola

Ponieważ grupujesz w dokumencie _id możesz po prostu umieścić pola, które chcesz zachować w grupie _id . Następnie możesz ponownie utworzyć formularz, używając $project

db.c.aggregate([
    { "$unwind": "$array_to_sort"},
    { "$sort": {"array_to_sort.b":1, "array_to_sort:a": 1}},
    { "$group": { 
        "_id": {
            "_id": "$_id",
            "unknown_field": "$unknown_field"
        },
        "Oarray_to_sort": { "$push":"$array_to_sort"}
    }},
    { "$project": {
        "_id": "$_id._id",
        "unknown_field": "$_id.unknown_field",
        "array_to_sort": "$Oarray_to_sort"
    }}
]);

Inną "sztuczką" jest użycie tymczasowej nazwy tablicy na etapie grupowania. Dzieje się tak, gdy $project i zmień nazwę, otrzymasz pola w kolejności określonej w oświadczeniu projekcji. Jeśli tego nie zrobiłeś, pole „array_to_sort” nie byłoby ostatnim polem w zamówieniu, ponieważ zostało skopiowane z poprzedniego etapu.

Jest to zamierzona optymalizacja w $project , ale jeśli chcesz zamówić, możesz to zrobić jak powyżej.

W przypadku zupełnie nieznanych struktur istnieje sposób działania mapReduce:

db.c.mapReduce(
    function () {
        this["array_to_sort"].sort(function(a,b) {
            return a.a - b.a || a.b - b.b;
        });

        emit( this._id, this );
    },
    function(){},
    { "out": { "inline": 1 } }
)

Oczywiście ma to format wyjściowy, który jest specyficzny dla mapReduce i dlatego nie jest dokładnie tym dokumentem, który miałeś, ale wszystkie pola są zawarte w "wartościach":

{
    "results" : [
            {
                    "_id" : 0,
                    "value" : {
                            "_id" : 0,
                            "some_field" : "a",
                            "array_to_sort" : [
                                    {
                                            "a" : 1,
                                            "b" : 0
                                    },
                                    {
                                            "a" : 3,
                                            "b" : 3
                                    },
                                    {
                                            "a" : 3,
                                            "b" : 4
                                    }
                            ]
                    }
            }
    ],
}

Przyszłe wersje ( od momentu pisania ) umożliwiają korzystanie z $$ROOT zmienna zbiorcza reprezentująca dokument:

db.c.aggregate([
    { "$project": {
        "_id": "$$ROOT",
        "array_to_sort": "$array_to_sort"
    }},
    { "$unwind": "$array_to_sort"},
    { "$sort": {"array_to_sort.b":1, "array_to_sort:a": 1}},
    { "$group": { 
        "_id": "$_id",
        "array_to_sort": { "$push":"$array_to_sort"}
    }}
]);

Nie ma więc sensu używać ostatniego etapu „projektu”, ponieważ tak naprawdę nie znasz innych pól w dokumencie. Ale wszystkie będą zawarte (w tym oryginalna tablica i porządek ) w _id pole dokumentu wynikowego.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Aktualizacja ścieżki „x” spowodowałaby konflikt w miejscu „x”

  2. Jak wysłać pobrany obraz z Mongo za pomocą GridFS w Spring Rest Call?

  3. Statefulset Kubernetes z trwałym woluminem NFS

  4. Jak zaktualizować pola Mongodb z flagą pominięcia w strukturze Golang

  5. Jak zatrzymać Mongo DB jednym poleceniem?