sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB/PHP:ta bort element från array

Eamorr,

$pull-operatorn kommer inte att fungera på dokumentet du använder, eftersom "notifications"-nyckeln egentligen inte är en array. Det är snarare ett inbäddat dokument, med numrerade nycklar, vilket gör att det ytligt liknar en array. Det finns inget sätt (som jag känner till) att behålla den här dokumentstrukturen och få de numrerade nycklarna att byta namn automatiskt.

Om du ändrar ditt dokument något så att det ser ut så här:

{
   "notifications": [
    {
       "type": "privateMessage",
       "fromUname": "Eamorr2",
       "time": 1292773522,
       "id": "1lfw70h789u13a1e67pv"
    },
    {
       "type": "privateMessage",
       "fromUname": "Eamorr2",
       "time": 1292773522,
       "id": "iwoidjsoskqp23nlwof"
    }
  ],
   "toUname": "Eamorr"
}

Elementen kommer fortfarande att vara numrerade, implicit. Det är nu en array, så du får det gratis. Du kan använda $pull-operatorn så här (jag är inte bekant med PHP-drivrutinen, så jag ger dig skalmotsvarigheten):

db.messages.update({ "toUname" : "Eamorr" }, { $pull : { "notifications" : { "id" : "1lfw70h789u13a1e67pv" }}});

Jag använde godtyckligt "toUname"-nyckeln för att identifiera dokumentet, men jag antar att du kommer att vilja använda _id-fältet. Jag använder också "id"-nyckeln för meddelandena för att identifiera meddelandet som ska hämtas från arrayen, eftersom det är mycket säkrare och ser till att du inte av misstag tar bort fel meddelande ifall arrayen har ändrats sedan du har identifierat arrayordningen som ska tas bort.

Jag hoppas att det hjälper.




  1. Finns det ett upsert-alternativ i mongodb insert-kommandot?

  2. Mongodb uppdaterar djupt kapslade underdokument

  3. Använder Redis ett användarnamn för autentisering?

  4. Mongodb installation misslyckades med att köra mongod