Как реализовать агрегатный конвейер Монго в промежуточном программном обеспечении? - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть две схемы - Продукты и Заказы - каждый заказ содержит массив продуктов, на которые ссылается object.id. То, что я пытаюсь сделать, это $ sum над product.sellPrice в массиве и установить totalSale перед сохранением нового документа заказа.

const orderSchema = new mongoose.Schema({
 products: [
 {
   type: mongoose.Schema.Types.ObjectId,
   ref: "Product"
 }
],
totalSale: {
  type: Number,
  min: 0
}
});


 const productSchema = new mongoose.Schema({
   name: {
          type: String,
          unique: true,
          required: true
   },
   sellPrice: {
          type: Number,
          min: 0,
          required: true
   }}):

Таким образом, каждый заказ будет содержать массив продуктов. То, что я пытался сделать, было в ловушке orderSchema.pre ('save'), я попытался запустить агрегирование следующим образом:

orderSchema.pre("save", function(next) {
  let order = this;
  order.totalSale = order.aggregate([
     { $unwind: { path: "$products" } },
     { $group: { _id: null, $sum: {} } }
  ]);

Возможно ли это или есть лучший способ подвести итоги цены каждого товара для заказа. Это действительно не должно быть предварительно («сохранить»)

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018
orderSchema.pre("save", function(next) {
  let order = this;
  let temp = order.products.map(product => {
    return { _id: mongoose.Types.ObjectId(product) };
  });
  let totalSale = 0;
  let promises = Product.find({ _id: { $in: temp } }).exec();
  promises
    .then(data => {
      data.forEach(product => {
        totalSale += product.sellPrice;
      });
      order.totalSale = totalSale;
      next();
    })
    .catch(err => {
      console.error(err);
    });
});

Поскольку find возвращает все соответствующие условия, я сохранил их в переменной, а затем перебрал их.

0 голосов
/ 14 сентября 2018

Прежде всего, да, можно использовать функцию агрегирования в пред..

Как насчет использования find() для продукта?

const Product = mongoose.model('Product');

OrderSchema.pre('save', function (next) {
    let order = this;

    // if products array is empty, skip the process
    if (!this.products || !Array.isArray(this.products) || !this.products.length < 1) {
        return next();
    }

    Product.find({ $in: this.products }, { sellPrice: 1 })
        .lean()
        .exec(function (err, products) {
            let totalSale = 0;

            if (Array.isArray(products)) {
                products.forEach(product => {
                    totalSale += product.sellPrice;
                });
            }

            order.totalSale = totalSale;
            next(err);
        });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...