Mongoose: мне нужно вычислить сумматор для некоторых полей в совокупности - PullRequest
0 голосов
/ 03 января 2019

У меня есть запрос (агрегат), и мне нужно вычислить сумматор для некоторых полей (value и comissionValue) и подсчитать, сколько регистров есть в этом запросе.

Мой запрос (агрегат)

  let findTerm = {
    store: req.body.store,
    status: {
      $in: resultStatusServices
    }
  }
  if (req.body.start) {
    findTerm.scheduleStart = {
      $lte: req.body.start
    };
  }

  if (req.body.period) {
    findTerm.scheduleEnd = {
      $gte: req.body.period
    };
  }

  Schedule.aggregate([{
              $match: findTerm              
            },
            {
              $project: {
                "employee.name": 1,
                "customer.name": 1,
                "service.name": 1,
                "value": 1,
                "scheduleDate": 1,
                "scheduleStart": 1,
                "scheduleEnd": 1,
                "comissionValue": 1,
                "status": 1,
                "paymentMethod": 1
              }
            },
            {
              $group:{
                _id: {
                  "employee.name" : "$employee.name",
                  "customer.name" : "$customer.name",
                  "service.name": "$service.name",
                  "value": "$value",
                  "scheduleDate": "$scheduleDate",
                  "scheduleStart" :"$scheduleStart",
                  "scheduleEnd": "$scheduleEnd",
                  "comissionValue" : "$comissionValue",
                  "status" : "$value",
                  "paymentMethod" : "$paymentMethod"
                },
              }
            },
            {
              $match: findTerm
            },
            {
              $group: {
                _id: {
                  id: "$store"
                },
                totalValue: {
                  $sum: "$value"
                },
                totalServices: {
                  "$sum": 1             
                },
                totalComission: {
                  $sum: "$comissionValue"
                },
                count: {
                  $sum: 1
                }
              }
            },
            {
              $sort: sort
            },
            {
              $skip: req.body.limit * req.body.page
            },
            {
              $limit: req.body.limit
            }

Расписание (модель)

 store: {
    type: String,
    required: true
  },
  customer: {
    id: {
      type: String
    },
    name: {
      type: String
    },
    avatar: String,
    phone: {
      type: String
    },
    email: { type: String },
    doc: {
      type: String
    },
  },
  employee: {
    id: {
      type: String,
      required: true
    },
    name: {
      type: String,
      required: true
    },
    avatar: String,
  },
  service: {
    id: {
      type: String
    },
    name: {
      type: String,
      required: true
    },
    filters: [String]
  },
  info: {
    channel: {
      type: String,
      required: true,
      default: 'app'
    },
    id: String,
    name: String
  },
  scheduleDate: {
    type: String,
    required: true
  },
  scheduleStart: {
    type: String,
    required: true
  },
  scheduleEnd: {
    type: String,
    required: true
  },
  value: {
    type: Number
  },
  comissionType: {
    type: String,
    default: '$'
  },
  comissionValue: {
    type: Number,
    default: 0
  },
  status: {
    type: Number,
    required: true
  },
  observation: String,
  paymentMethod: {
    type: Number,
    default: 0
  },

Что я пытаюсь сделать в результате этого запроса:

[
0:{
comissionValue: 14
customer: {name: "Marcelo"}
employee: {name: "Andy"}
paymentMethod: 0
scheduleDate: "2019-01-01"
scheduleEnd: "2019-01-01 09:30"
scheduleStart: "2019-01-01 09:00"
service: {name: "Barber"}
status: 2
value: 20
_id: "5c26275ffe046d25a07cb466"}
1: {...}
2: {...}
...
],[totalizers: { count: 2, totalServices: 50, totalComission:65}]

Как я могу это сделать, как я могу сделать это сумматоры?

1 Ответ

0 голосов
/ 03 января 2019

Вы можете использовать $facet для выполнения этого типа запроса, поскольку он позволяет запускать различные агрегаты для одного и того же набора входных документов без необходимости извлечения входных документов.многократно.Первый фасет может иметь конвейер запроса с сортировкой и лимитом, а другой фасет будет давать совокупные суммы (totalizers).

Например, следующая агрегирующая операция даст желаемый результат:

Schedule.aggregate([
    { '$match': findTerm },
    { '$facet': {
        'data': [
            { '$project': {
                'employee.name': 1,
                'customer.name': 1,
                'service.name': 1,
                'value': 1,
                'scheduleDate': 1,
                'scheduleStart': 1,
                'scheduleEnd': 1,
                'comissionValue': 1,
                'status': 1,
                'paymentMethod': 1
            } },
            { '$sort': sort },
            { '$skip': req.body.limit * req.body.page },
            { '$limit': req.body.limit }
        ],
        'totalizer': [
            { '$group': {
                '_id': '$store',
                'count': { '$sum': 1 },
                'totalValue': { '$sum': '$value' },
                'totalComission': { '$sum': '$comissionValue' }
            } },
            { '$group': {
                '_id': null,
                'storesCount': { 
                    '$push': {
                        'store': '$_id',
                        'count': '$count'
                    }    
                },
                'totalValue': { '$sum': '$totalValue' },
                'totalServices': { '$sum': '$count' },
                'totalComission': { '$sum': '$totalComission' }
            } }
        ]
    } }
]).exec((err, results) => {
    if (err) handleError(err);
    console.log(results[0]);
})
...