Tengo la siguiente operación de actualización:
private async onCategoryImagesModified(data: ModifiedFilesEventData) { this.categoryModel .findByIdAndUpdate(data.resourceId, { $pullAll: { images: data.removedFiles || [] }, $addToSet: { images: { $each: data.addedFiles || [] } } }).catch(error => this.logger.warn(error)) } Básicamente, cada vez que las imágenes de la category del modelo cambian, quiero actualizar el documento eliminando todas las rutas eliminadas de las images y agregando las nuevas rutas a images .
Entiendo que no puedo hacer referencia al mismo campo más de una vez dentro de una actualización, pero ¿hay alguna manera de hacerlo sin 2 operaciones de actualización separadas?
Entiendo que no puedo hacer referencia al mismo campo más de una vez dentro de una actualización
La actualización no admitirá el mismo campo más de una vez, si desea hacer esto en la consulta única, puede intentar actualizar con canalización de agregación a partir de MongoDB 4.2,
$filter para iterar el bucle de images y eliminar los elementos de entrada por $not y $in$setUnion para obtener elementos únicos de los elementos de entrada y el campo de images private async onCategoryImagesModified(data: ModifiedFilesEventData) { let stages = []; // remove fields if (data.removedFiles) { stages.push({ $set: { images: { $filter: { input: "$images", cond: { $not: { $in: ["$$this", data.removedFiles] } } } } } }); } // add fields if (data.addedFiles) { stages.push({ $set: { images: { $setUnion: ["$images", data.addedFiles] } } }); } this.categoryModel .findByIdAndUpdate(data.resourceId, [stages]) .catch(error => this.logger.warn(error)) }