sql >> Databáze >  >> NoSQL >> MongoDB

Jak agregovat se skupinou podle a správně třídit

Je zde několik úlovků, které je třeba pochopit.

Když používáte $group hranice budou seřazeny v pořadí, v jakém byly objeveny, bez počáteční nebo koncové fáze $sort úkon. Takže pokud byly vaše dokumenty původně v takovém pořadí:

{ 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" },

Pak stačí použít $group bez $sort na konci potrubí by vám vrátil výsledky takto:

{ 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 je jeden koncept, ale ve skutečnosti se zdá, že to, co očekáváte ve výsledcích, vyžaduje vrácení „posledních ostatních polí“ v seřazeném pořadí uid je to, co hledáte. V takovém případě způsob, jak získat výsledek, je ve skutečnosti $sort nejprve a poté použijte $last operátor:

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" }
    }}
])

Nebo v podstatě použijte řazení na to, co chcete.

Rozdíl mezi $last a $max spočívá v tom, že tento vybere "nejvyšší" hodnotu pro dané pole v rámci seskupení _id , bez ohledu na aktuální řazení podle neseřazeného pořadí. Na druhou stranu $last vybere hodnotu, která se vyskytuje ve stejném "řádku" jako "poslední" seskupení _id hodnotu.

Pokud jste skutečně hledali řazení hodnot pole, pak je přístup podobný. Udržování členů pole v "vytvořeném" pořadí byste také nejprve seřadili:

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 s těmito poli budou přidány do pole v pořadí, ve kterém již byly seřazeny.



  1. Jaký je nejlepší způsob ukládání dat v MongoDB?

  2. Android/MongoDB:NoClassDefFoundError:com.mongodb.DBPortPool

  3. MongoError:připojte ECONNREFUSED 127.0.0.1:27017

  4. Problém MongoDB \uXXXX