Non so cosa hai provato poiché semplicemente non è incluso nella tua domanda, ma il modo migliore per verificare la presenza di un array vuoto è fondamentalmente guardare dove 0
l'indice non corrisponde a $exists
:
Inventory.update(
{ "products.rates.0": { "$exists": false } },
{
"$pull": {
"products": { "rates.0": { "$exists": false } }
}
},
{ "multi": true },
function(err,numAffected) {
}
)
La parte "query" di .update()
istruzione sta facendo in modo che tentiamo anche solo di toccare i documenti che hanno un array vuoto in "products.rates"
. Ciò non è richiesto, ma evita di testare la seguente condizione dell'istruzione "aggiornamento" su documenti in cui tale condizione non è true
per qualsiasi elemento dell'array, e quindi rende le cose un po' più veloci.
La parte "aggiornamento" effettiva si applica $pull
sul "products"
array per rimuovere tutti gli elementi in cui il "rates"
"interiore". è un array vuoto. Quindi il "percorso" all'interno di $pull
sta effettivamente guardando all'interno dei "products"
contenuto comunque, quindi è relativo a quello e non all'intero documento.
Naturalmente $pull
rimuoverà tutti gli elementi che corrispondono in una singola operazione. Il "multi"
è necessario solo quando vuoi davvero aggiornare più di un documento con la dichiarazione