Как удалить в каскаде в нескольких моделях с мангуста? - PullRequest
2 голосов
/ 20 июня 2019

У меня есть 3 модели в мангусте:

TravelSchema

var travelSchema = new mongoose.Schema({
    name: String,
    description: String,
    mexican_currency_value: mongoose.Schema.Types.Decimal128
})

travelSchema.pre('deleteOne', function(next) {
    const id = this.getQuery()['_id'];
    Product.deleteMany({ travel: id }, (err, value) => {
    });
    next();    
});

ProductSchema

var productSchema = new mongoose.Schema({
    name: String,
    description: String,
    purchased_amount: Number,
    unit_price_mex: mongoose.Schema.Types.Decimal128,
    unit_price_to_sell: mongoose.Schema.Types.Decimal128,
    travel: { type: mongoose.Schema.Types.ObjectId, ref: 'Travel' }
})

InvoiceSchema

var invoiceSchema = new mongoose.Schema({
    product: productSchema,
    client: { type: mongoose.Schema.Types.ObjectId, ref: 'Client' },
    purchased_amount: Number,
    fch: String
});

Там, где у Travel и Product есть отношение один-ко-многим , а у продукта и счета-фактуры - отношение один-ко-многим . Мне нужно следующее:

  • При удалении поездки все продукты, связанные с этой поездкой, также удаляются.

  • При исключении этих продуктов все счета-фактуры, связанные с каждым продуктом, также исключаются.

Мне удалось удалить все продукты, но когда я пытаюсь удалить счета, я не получаю идентификаторы продуктов.

invoiceSchema.pre('deleteMany', (next) => {
    console.log(this);
    // this print { n: 2, ok: 1, deletedCount: 2 }
})

1 Ответ

0 голосов
/ 22 июня 2019

Я думаю, вам следует начать с другой стороны, когда вы смотрите на удаление всех связанных документов. Как и у вас travel id, вы получите все продукты и сохраните их идентификатор в массиве, и тогда ваше first удаление будет иметь invoices, где product._id: { $ in: _arrayOfProducIds }. Как только это будет завершено, тогда deleteMany ваш products, так как у вас уже есть их ids в _arrayOfProducIds и, наконец, имеете дело с Travel:

travelSchema.pre('deleteOne', function(next) {
    const id = this.getQuery()['_id'];  // travel id check
    // Query to get all the product ids based on the travel id and return array for `$in`
    const productIds = this.DoYourQuery  // [productIds] check
    Invoice.deleteMany({'product._id': { $in: productIds }}, // ... etc
    Product.deleteMany({ _id': { $in: productIds }}, // ... etc
    next();    
});

Я бы предположил, что у вас нет большого количества товаров и счетов-фактур ... таких, как тысячи, с тех пор $in может быть некоторой проблемой производительности. Надеюсь, это поможет.

...