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

Mongoose find/opdater underdokument

Så som du bemærker, er standarden i mongoose, at når du "indlejrer" data i et array som dette, får du et _id værdi for hver array-indgang som en del af dens egne underdokumentegenskaber. Du kan faktisk bruge denne værdi til at bestemme indekset for den vare, du har til hensigt at opdatere. MongoDB-måden at gøre dette på er den positionelle $ operatorvariabel, som holder den "matchede" position i arrayet:

Folder.findOneAndUpdate(
    { "_id": folderId, "permissions._id": permission._id },
    { 
        "$set": {
            "permissions.$": permission
        }
    },
    function(err,doc) {

    }
);

Det .findOneAndUpdate() metoden vil returnere det ændrede dokument, eller på anden måde kan du bare bruge .update() som en metode, hvis du ikke skal have dokumentet returneret. Hoveddelene "matcher" elementet i arrayet for at opdatere og "identificerer", der matcher med den positionelle $ som tidligere nævnt.

Så bruger du selvfølgelig $set operatør, så kun de elementer du angiver sendes faktisk "over the wire" til serveren. Du kan tage dette videre med "dot notation" og blot angive de elementer, du rent faktisk vil opdatere. Som i:

Folder.findOneAndUpdate(
    { "_id": folderId, "permissions._id": permission._id },
    { 
        "$set": {
            "permissions.$.role": permission.role
        }
    },
    function(err,doc) {

    }
);

Så det er den fleksibilitet, som MongoDB giver, hvor du kan være meget "målrettet" i, hvordan du faktisk opdaterer et dokument.

Hvad dette dog gør, er at "omgå" enhver logik, du måtte have indbygget i dit "mongoose"-skema, såsom "validering" eller andre "pre-save hooks". Det er fordi den "optimale" måde er en MongoDB "funktion", og hvordan den er designet. Mongoose selv forsøger at være en "bekvemmelig" indpakning over denne logik. Men hvis du er parat til selv at tage lidt kontrol, så kan opdateringerne laves på den mest optimale måde.

Så hvor det er muligt at gøre det, skal du holde dine data "indlejret" og ikke bruge refererede modeller. Det giver mulighed for atomopdatering af både "forældre" og "barn" elementer i simple opdateringer, hvor du ikke behøver at bekymre dig om samtidighed. Det er sandsynligvis en af ​​grundene til, at du skulle have valgt MongoDB i første omgang.



  1. Få værdier med jedis pipeline

  2. MongoDB-ydelse:Kørsel af MongoDB-aggregeringer på sekundære

  3. MongoDB Node check om objectid er gyldigt

  4. Vælg Grupper efter antal og særskilt antal i samme mongodb-forespørgsel