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

Come rimuovere un elemento da un array a doppia nidificazione in un documento MongoDB.

Per eliminare l'elemento in questione utilizzerai effettivamente un aggiornamento. Più specificamente, eseguirai un aggiornamento con $pull comando che rimuoverà l'elemento dall'array.

db.temp.update(
  { _id : "777" },
  {$pull : {"someArray.0.someNestedArray" : {"name":"delete me"}}}
)

C'è un po' di "magia" che sta accadendo qui. Usando .0 indica che sappiamo che stiamo modificando l'elemento 0 di someArray . Utilizzo di {"name":"delete me"} indica che conosciamo i dati esatti che intendiamo rimuovere.

Questo processo funziona perfettamente se carichi i dati in un client e quindi esegui l'aggiornamento. Questo processo funziona meno bene se si desidera eseguire query "generiche" che eseguono queste operazioni.

Penso che sia più facile riconoscere semplicemente che l'aggiornamento di array di documenti secondari generalmente richiede che tu abbia l'originale in memoria a un certo punto.

In risposta al primo commento qui sotto, probabilmente puoi aiutare la tua situazione modificando un po' la struttura dei dati

"someObjects" : {
  "name1":  {
        "someNestedArray" : [
            {
                "name" : "value"
            },
            {
                "name" : "delete me"
            }
        ]
    }
}

Ora puoi fare {$pull : { "someObjects.name1.someNestedArray" : ...

Ecco il problema con la tua struttura. MongoDB non ha un ottimo supporto per la manipolazione dei "sub-array". La tua struttura ha un array di oggetti e quegli oggetti contengono array di più oggetti.

Se hai la seguente struttura, avrai difficoltà a usare cose come $pull :

array [
  { subarray : array [] },
  { subarray : array [] },
]

Se la tua struttura è così e vuoi aggiornare subarray hai due opzioni:

  1. Cambia la tua struttura in modo da poter sfruttare $pull .
  2. Non utilizzare $pull . Carica l'intero oggetto in un client e usa findAndModify .