sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur drar man en instans av ett objekt i en array i MongoDB?

Så du har rätt i att $pull operatören gör exakt vad dokumentationen säger genom att dess argument i själva verket är en "fråga" som används för att matcha de element som ska tas bort.

Om ditt arrayinnehåll råkade alltid ha elementet i den "första" positionen som du visar, så är $pop operatorn tar faktiskt bort det första elementet.

Med den grundläggande noddrivrutinen:

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 är argumentet att returnera det modifierade dokumentet annorlunda:

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

    }
);

Men ingen av dem är till stor nytta om arraypositionen för det "första" objektet att ta bort inte är känd.

För det allmänna tillvägagångssättet här behöver du "två" uppdateringar, en för att matcha det första objektet och ersätta det med något unikt som ska tas bort, och den andra för att faktiskt ta bort det ändrade objektet.

Detta är mycket enklare om du tillämpar enkla uppdateringar och inte ber om det returnerade dokumentet, och det kan också göras i bulk över dokument. Det hjälper också att använda något som async.series för att undvika kapsla dina samtal:

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å med hjälp av $unset här med positionen $ operatorn tillåter att det "första" objektet ändras till null . Sedan den efterföljande frågan med $pull tar bara bort någon null ingång från arrayen.

Det är så du tar bort den "första" förekomsten av ett värde på ett säkert sätt från en array. Att avgöra om den matrisen innehåller mer än ett värde som är detsamma är en annan fråga.



  1. spring-redis kan inte ansluta till fjärrvärden

  2. Skriv din första rådgivare

  3. Så här tar du emot Redis-publiceringsmeddelande i Go

  4. MurmurHash - vad är det?