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

Jak agregować z grupowaniem według i poprawnie sortować

Jest tu kilka haczyków do zrozumienia.

Gdy używasz $group granice zostaną posortowane w kolejności, w jakiej zostały odkryte, bez etapu początkowego lub końcowego $sortuj operacja. Więc jeśli Twoje dokumenty były pierwotnie w takiej kolejności:

{ uid: 1, created: ISODate("2014-05-02..."), another_col : "x" },
{ uid: 1, created: ISODate("2014-05-05..."), another_col : "y" },
{ uid: 3, created: ISODate("2014-05-05..."), another_col : "w" },
{ uid: 2, created: ISODate("2014-05-10..."), another_col : "z" },

Następnie wystarczy użyć $group bez $sort na końcu potoku zwróci wyniki w następujący sposób:

{ uid: 1, created: ISODate("2014-05-05..."), another_col : "y" },
{ uid: 3, created: ISODate("2014-05-05..."), another_col : "w" },
{ uid: 2, created: ISODate("2014-05-10..."), another_col : "z" },

To jedna koncepcja, ale wygląda na to, że to, czego oczekujesz w wynikach, wymaga zwrócenia „ostatnich innych pól” według posortowanej kolejności uid jest tym, czego szukasz. W takim przypadku sposobem na uzyskanie wyniku jest w rzeczywistości $sort najpierw, a następnie skorzystaj z $last operator:

db.mycollection.aggregate([

    // Sorts everything first by _id and created
    { "$sort": { "_id": 1, "created": 1 } },

    // Group with the $last results from each boundary
    { "$group": {
        "_id": "$uid",
        "created": { "$last": "$created" },
        "another_col": { "$last": "$created" }
    }}
])

Lub zasadniczo zastosuj rodzaj do tego, co chcesz.

Różnica między $last i $max jest to, że ten ostatni wybierze "najwyższą" wartość dla danego pola w ramach grupy _id , niezależnie od bieżącego posortowanego w nieposortowanej kolejności. Z drugiej strony $last wybierze wartość, która występuje w tym samym „wierszu” co „ostatnie” grupowanie _id wartość.

Jeśli rzeczywiście chciałbyś posortować wartości tablicy, podejście jest podobne. Utrzymując elementy tablicy w „utworzonej” kolejności, należy najpierw posortować:

db.mycollection.aggregate([

    // Sorts everything first by _id and created
    { "$sort": { "_id": 1, "created": 1 } },

    // Group with the $last results from each boundary
    { "$group": {
        "_id": "$uid",
        "row": {
            "$push": {
                "created": "$created",
                "another_col": "$another_col"
            }
        }
    }}
])

A dokumenty z tymi polami zostaną dodane do tablicy w kolejności, w jakiej zostały już posortowane.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. apollostack/graphql-server - jak uzyskać pola żądane w zapytaniu z resolvera

  2. jak usunąć określony obiekt z obiektu tablicy w MongoDB

  3. koszt kluczy w bazie dokumentów JSON (mongodb, elasticsearch)

  4. MongoDB:aktualizuj każdy dokument w jednym polu

  5. Żaden serwer nie został wybrany przez WritableServerSelector z klastra