MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment ne renvoyer que la première occurrence d'un ID avec Mongoose ?

Nous pouvons utiliser le cadre d'agrégation pour ce faire. Nous devons d'abord $sort par user et "_id". À partir de là, nous $group par "utilisateur" et utilisez le $last Opérateur d'accumulateur pour renvoyer le dernier document pour chaque utilisateur. Notez que nous pouvons également utiliser le $first opérateur d'accumulation si nous trions nos documents par ordre décroissant, mais en triant par ordre croissant et en utilisant $last clarifions notre intention.

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

qui produit :

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

Nous voudrons peut-être ajouter un $project à notre pipeline, mais cela entraînera une baisse des performances. Cependant, cela réduira à la fois la quantité de données envoyées sur le réseau et le temps et la mémoire utilisés pour décoder les documents côté client si vous n'avez pas besoin de toutes les paires clé/valeur dans un document renvoyé.

Le $project la scène ressemble à ceci :

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