sql >> Database >  >> NoSQL >> MongoDB

MongoDB/PHP:verwijder element uit array

Eamorr,

De $pull-operator werkt niet op het document dat u gebruikt, omdat de "notifications"-toets niet echt een array is. Het is eerder een ingebed document, met genummerde sleutels, waardoor het oppervlakkig lijkt op een array. Er is geen manier (voor zover ik weet) om deze documentstructuur te behouden en de genummerde sleutels automatisch te hernoemen.

Als u uw document enigszins refactoreert, ziet het er als volgt uit:

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

De elementen worden nog steeds genummerd, impliciet. Het is nu een array, dus die krijg je gratis. Je kunt de $pull-operator als volgt gebruiken (ik ben niet bekend met de PHP-driver, dus ik geef je het shell-equivalent):

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

Ik heb willekeurig de "toUname" -sleutel gebruikt om het document te identificeren, maar ik denk dat je het _id-veld wilt gebruiken. Ik gebruik ook de "id"-sleutel van de berichten om het bericht te identificeren dat uit de array moet worden gehaald, omdat het een stuk veiliger is en ervoor zorgt dat je niet per ongeluk het verkeerde bericht verwijdert voor het geval de array sindsdien is gewijzigd je hebt de array-ordinaal geïdentificeerd die je wilt verwijderen.

Ik hoop dat dat helpt.




  1. Hoe te groeperen op meerdere kolommen en meerdere waarden in mongodb

  2. mongodb-updates worden niet weergegeven tenzij ik de node-server opnieuw start

  3. Spring Data MongoDB Annotatie @CreatedDate werkt niet, wanneer ID handmatig wordt toegewezen

  4. Heroku aangepast domein werkt niet