Não sei o que você tentou, pois simplesmente não está incluído na sua pergunta, mas a melhor maneira de verificar se há uma matriz vazia é basicamente procurar onde o
0
o índice não corresponde a $exists
:Inventory.update(
{ "products.rates.0": { "$exists": false } },
{
"$pull": {
"products": { "rates.0": { "$exists": false } }
}
},
{ "multi": true },
function(err,numAffected) {
}
)
A parte "query" do
.update()
é garantir que apenas tentemos tocar em documentos que tenham uma matriz vazia em "products.rates"
. Isso não é necessário, mas evita testar a seguinte condição de instrução "update" em documentos em que essa condição não é true
para qualquer elemento da matriz e, portanto, torna as coisas um pouco mais rápidas. A parte "atualização" real se aplica a
$pull
nos "products"
array para remover qualquer um desses itens onde o "interno" "rates"
é uma matriz vazia. Portanto, o "caminho" dentro do $pull
está realmente olhando dentro de "products"
conteúdo de qualquer maneira, então é relativo a isso e não a todo o documento. Naturalmente
$pull
removerá todos os elementos correspondentes em uma única operação. O "multi"
só é necessário quando você realmente deseja atualizar mais de um documento com a instrução