我有以下更新操作:
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))
}
基本上,每次模型category
的图像发生变化时,我都想通过从images
和中删除所有已删除的路径来更新文档。为images
添加新路径。
我知道我不能在更新中多次引用同一个字段,但是有没有办法在没有的情况下做到这一点2个独立的更新操作?
我知道我不能在一次更新中多次引用同一个字段
更新将不支持同一字段多次,如果你想在单个查询中这样做,你可以尝试从MongoDB 4.2开始使用聚合管道更新,
$filter
迭代images
的循环并移除$not
和$in
的输入元素$setUnion
从输入元素和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))
}
游乐场