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

Hvordan trækker man en forekomst af et element i et array i MongoDB?

Så du har ret i, at $pull operatør gør præcis, hvad dokumentationen siger, idet dens argumenter i virkeligheden er en "forespørgsel", der bruges til at matche de elementer, der skal fjernes.

Hvis dit array-indhold tilfældigvis altid havde elementet i den "første" position, som du viser, så $pop operatøren fjerner faktisk det første element.

Med den grundlæggende nodedriver:

collection.findOneAndUpdate(
    { "array.0": "bird" },       // "array.0" is matching the value of the "first" element 
    { "$pop": { "array": -1 } },
    { "returnOriginal": false },
    function(err,doc) {

    }
);

Med mongoose er argumentet for at returnere det ændrede dokument anderledes:

MyModel.findOneAndUpdate(
    { "array.0": "bird" },
    { "$pop": { "array": -1 } },
    { "new": true },
    function(err,doc) {

    }
);

Men ingen af ​​dem er til stor nytte, hvis array-positionen for det "første" element, der skal fjernes, ikke er kendt.

For den generelle tilgang her har du brug for "to" opdateringer, nemlig en til at matche det første element og erstatte det med noget unikt, der skal fjernes, og den anden til faktisk at fjerne det ændrede element.

Dette er meget mere enkelt, hvis du anvender simple opdateringer og ikke beder om det returnerede dokument, og det kan også gøres i bulk på tværs af dokumenter. Det hjælper også at bruge noget som async.series for at undgå at indlejre dine opkald:

async.series(
    [
        function(callback) {
            collection.update(
                { "array": "bird" },
                { "$unset": { "array.$": "" } },
                { "multi": true }
                callback
            );
        },
       function(callback) {
           collection.update(
                { "array": null },
                { "$pull": { "array": null } },
                { "multi": true }
                callback
           );
       }
    ],
    function(err) {
       // comes here when finished or on error   
    }
);

Så ved at bruge $unset her med den positionelle $ operatøren tillader, at det "første" element ændres til null . Derefter den efterfølgende forespørgsel med $pull fjerner bare enhver null indgang fra arrayet.

Det er sådan, du fjerner den "første" forekomst af en værdi sikkert fra et array. Det er et andet spørgsmål at bestemme, om det array indeholder mere end én værdi, der er den samme.



  1. Express Node.JS - Modtager Redis callback, udfører løfter

  2. mongodb få _id som streng i find-forespørgsel

  3. Konverter en streng til et tal i MongoDB-projektion

  4. Hvordan forespørger du *korrekt* Redis fra Tornado?