MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come restituire solo la prima occorrenza di un ID con Mongoose?

Possiamo usare il framework di aggregazione per farlo. Per prima cosa dobbiamo $sort per user e "_id". Da lì, $group per "utente" e utilizzare $last operatore accumulatore per restituire l'ultimo documento per ogni utente. Tieni presente che possiamo anche utilizzare $first operatore accumulatore se ordiniamo i nostri documenti in ordine decrescente, ma in ordine crescente e utilizzando $last chiarire la nostra intenzione.

db.collection.aggregate([
    { "$sort": { "user": 1, "_id": -1 } }, 
    { "$group": { 
        "_id": "$user", 
        "user": { "$last": "$$ROOT" } 
    }} 
])

che produce:

{
    "_id" : "fje93jrg4",
    "user" : {
        "_id" : 2,
        "user" : "fje93jrg4",
        "event" : null,
        "group" : null,
        "name" : "Bob",
        "text" : "Testing"
    }
}
{
    "_id" : "94fg844f",
    "user" : {
        "_id" : 1,
        "user" : "94fg844f",
        "event" : null,
        "group" : null,
        "name" : "Jake",
        "text" : "Hello world"
    }
}
{
    "_id" : null,
    "user" : {
        "_id" : 4,
        "user" : null,
        "event" : "d0j3n9fn3",
        "group" : null,
        "name" : "My Event",
        "text" : "Testing 2"
    }
}

Potremmo voler aggiungere un $project alla nostra pipeline, ma ciò causerà un calo delle prestazioni. Tuttavia ridurrà sia la quantità di dati inviati via cavo che il tempo e la memoria utilizzati per decodificare i documenti sul lato client se non è necessario restituire tutte le coppie chiave/valore in un documento.

Il $project fase assomiglia a questo:

{ "$project": {
    "_id": "$user._id",
    "user": "$user.user",
    "event": "$user.event",
    "group": "$user.group",
    "name": "$user.name",
    "text": "$user.text"
}}