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

Hvordan returnerer man kun den første forekomst af et ID med Mongoose?

Vi kan bruge aggregeringsrammen til at gøre dette. Først skal vi $sort af user og "_id". Derfra $group af "bruger" og brug $last akkumulatoroperatør for at returnere det sidste dokument for hver bruger. Bemærk, at vi også kan bruge $first akkumulatoroperator, hvis vi sorterer vores dokumenter i faldende rækkefølge, men sorterer i stigende rækkefølge og bruger $last gøre vores hensigt klar.

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

som producerer:

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

Vi ønsker måske at tilføje et $project til vores pipeline, men at gøre det vil medføre et fald i ydeevnen. Det vil dog reducere både mængden af ​​data, der sendes over ledningen, og den tid og hukommelse, der bruges til at afkode dokumenter på klientsiden, hvis ikke alle nøgle/værdi-parrene i et dokument skal returneres.

$project scenen ser sådan ud:

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


  1. Gruppér efter tilstand i MongoDB

  2. Heroku-appen går ned efter MongoDB opdateret til 3.0

  3. MongoDB ikke autoriseret til forespørgsel - kode 13

  4. mongodb-tjenesten starter ikke op