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

MongoDB/PHP:slet element fra array

Eamorr,

$pull-operatoren vil ikke fungere på det dokument, du bruger, fordi "notifications"-tasten ikke rigtig er et array. Det er snarere et indlejret dokument med nummererede taster, hvilket gør det overfladisk til at ligne en matrix. Der er ingen måde (som jeg kender til) at beholde denne dokumentstruktur og få de nummererede taster omdøbt automatisk.

Hvis du omfaktorerer dit dokument lidt, så det ser sådan ud:

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

Elementerne vil stadig være nummererede, implicit. Det er nu et array, så du får det gratis. Du kan bruge $pull-operatoren som denne (jeg er ikke bekendt med PHP-driveren, så jeg giver dig shell-ækvivalenten):

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

Jeg brugte vilkårligt "toUname"-nøglen til at identificere dokumentet, men jeg gætter på, at du vil bruge _id-feltet. Jeg bruger også "id"-nøglen til meddelelserne til at identificere meddelelsen, der skal trækkes fra arrayet, da det er meget sikrere og sikrer, at du ikke ved et uheld fjerner den forkerte meddelelse, hvis arrayet har ændret sig siden du har identificeret den rækkefølge, der skal fjernes.

Jeg håber, det hjælper.




  1. Mongodb Læs præferencer

  2. Redis under klassisk ASP(VBScript)

  3. Har brug for hjælp til konceptualisering i Redis/NoSQL

  4. MongoDB:Hvad er meningen med at bruge MapReduce uden parallelitet?