Вы можете использовать findOneAndDelete pre и post ловушки для выполнения sh this.
Как вы видите в ловушке pre findOneAndDelete, мы сохраняем ссылку на удаленный документ и передаем ее в postfindOneAndDelete, поэтому что мы можем получить доступ к модели с помощью конструктора и использовать метод updateMany, чтобы иметь возможность корректировать заказы.
PageSchema.pre("findOneAndDelete", async function(next) {
this.page = await this.findOne();
next();
});
PageSchema.post("findOneAndDelete", async function(doc, next) {
console.log(doc);
const result = await this.page.constructor.updateMany(
{ order: { $gt: doc.order } },
{
$inc: {
order: -1
}
}
);
console.log(result);
next();
});
Допустим, у вас есть эти 3 документа:
[
{
"_id": ObjectId("5e830a6d0dec1443e82ad281"),
"content": "content1",
"order": 0,
"__v": 0
},
{
"_id": ObjectId("5e830a6d0dec1443e82ad282"),
"content": "content2",
"order": 1,
"__v": 0
},
{
"_id": ObjectId("5e830a6d0dec1443e82ad283"),
"content": "content3",
"order": 2,
"__v": 0
}
]
При удалении content2 с "_id": ObjectId("5e830a6d0dec1443e82ad282")
с методом findOneAndDelete, например:
router.delete("/pages/:id", async (req, res) => {
const result = await Page.findOneAndDelete({ _id: req.params.id });
res.send(result);
});
Промежуточное программное обеспечение будет запускаться и корректировать заказы, остальные 2 документа будут выглядеть так:
[
{
"_id": ObjectId("5e830a6d0dec1443e82ad281"),
"content": "content1",
"order": 0,
"__v": 0
},
{
"_id": ObjectId("5e830a6d0dec1443e82ad283"),
"content": "content3",
"order": 1, => DECREASED FROM 2 to 1
"__v": 0
}
]
Также вам лучше включить следующее в промежуточное ПО предварительного сохранения, чтобы другие промежуточные программы также работали, если вы добавите позже.
PageSchema.pre("save", async function(next) {
if (!this.order) {
const lastPage = await this.constructor.findOne().sort({ order: -1 });
this.order = lastPage ? lastPage.order + 1 : 0;
}
next();
});