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