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

Analog dla połączenia grupowego w sql

Zgodnie z dotychczasowymi komentarzami nie jest jasne, co grupujesz lub co chcesz jako wynik końcowy, poza tym, że chcesz, aby daty były połączone w coś w rodzaju „tylko dzień”, bez godzin i minut razem. Przypuszczalnie potrzebujesz tych wyjątkowych dni w jakimś celu.

Istnieją różne operatory daty w potoku można używać w datach, a jest to $concat operatora. Niestety wszyscy Operatorzy dat generować liczbę całkowitą jako wynik, a dla żądanego rodzaju ciągu Date, $concat działa tylko z ciągami. Innym problemem jest to, że nie możesz rzucać liczbę całkowitą do ciągu znaków w agregacji.

Ale możesz użyj poddokumentów, tutaj będziemy pracować tylko z datą:

db.record.aggregate([
    // Unwind the array to work with it
    {$unwind: "$date"},

    // project into our new 'day' document
    {$project:{ 
        day: { 
            year: {$year: "$date"},
            month: {$month: "$date"}, 
            day: {$dayOfMonth: "$date"}
        }
     } },

     // optionalally sort if date order is important [ oldest -> newest ] 
     {$sort: { "day.year": -1, "day.month": -1, "day.day": -1}},

     // Wind back unique values into the array
     {$group: {_id:"$_id", days: {$addToSet: "$day"} }}
])

Nie jest to więc ciąg, ale można go łatwo przetworzyć w jeden, ale co najważniejsze, można go pogrupować i sortować.

Zasady pozostają takie same, jeśli chcesz uzyskać unikalne dates w ten sposób jako tablicę na końcu lub czy chcesz pogrupować sumy według tych dat. Dlatego pamiętaj przede wszystkim o częściach $unwind i $project używających operatorów daty.

--EDYTUJ--

Podziękowania dla społeczności, jak pokazano w tym poście jest to nieudokumentowane zachowanie $substr , w którym liczby całkowite mogą być rzucane jako łańcuchy.

db.record.aggregate([
    // Unwind the array to work with it
    {$unwind: "$date"},

    // project into our new 'day' document
    {$project:{ 
        day: { 
            year: {$year: "$date"},
            month: {$month: "$date"}, 
            day: {$dayOfMonth: "$date"}
        }
     } },

     // optionalally sort if date order is important [ oldest -> newest ] 
     {$sort: { "day.year": -1, "day.month": -1, "day.day": -1}},

     // now we are going to project to a string ** magic @heinob **
     {$project: { 
         day: {$concat: [
             {$substr: [ "$day.year", 0, 4 ]},
             "-",
             {$substr: [ "$day.month", 0, 2 ]},
             "-",
             {$substr: [ "$day.day", 0, 2 ]}
         ]}
     }},

     // Wind back unique values into the array
     {$group: {_id:"$_id", days: {$addToSet: "$day"} }}
])

A teraz days są struny. Jak wspomniałem wcześniej, jeśli kolejność jest dla Ciebie ważna, najlepszym podejściem jest rzutowanie na typ dokumentu, tak jak to zostało zrobione, i sortowanie według klawiszy numerycznych. Naturalnie $projekt, który przekształca datę, można nawinąć na etap $group dla zwięzłości, co prawdopodobnie chcesz zrobić podczas pracy z całym dokumentem.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB - Dlaczego powinienem używać kursora zamiast iterator_to_array (w PHP)

  2. mangusta wypełnij odniesienie do poddokumentu

  3. Jak sprawić, by osadzony mongodb zachował dane po zamknięciu aplikacji?

  4. Zachowanie projekcji Morphia dla przykładowej zmiennej z wartością domyślną

  5. Jak używać referencji db z reaktywną Spring Data MongoDB?