как использовать агрегат mon goose для поиска в массиве в коллекции - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь сгруппировать по продуктам в своей коллекции продаж и сложить их итоги, чтобы узнать, какие продукты являются самыми продаваемыми в моем приложении.

MON GOOSE MODEL

const mongoose = require('mongoose');

const DHCustomerinvoiceSchema = mon goose .Schema ({

    Saledetail: {
        type: Array,
        required: true
    }, 
    date:{
       type: Date,
       required: true     
   },
   total:{
        type: Number,
        required: true  
   },
   pay:{
    type: Number,
    required: true,
    default: 0 
   },
   topay:{
     type: Number,
     required: true 
   },
   user:{
    type: mongoose.Schema.Types.ObjectId,
    required: true,
    ref: 'UserDH'
   },
   customer:{
       type: mongoose.Schema.Types.ObjectId,
       required: true,
       ref: 'DHcontacto'
   },
   state:{
       type: String,
       default: "OWED"  
   },
   created:{
    type: Date,
    default: Date.now()
   },


});

module.exports = mongoose.model('DHCustomerinvoice', DHCustomerinvoiceSchema);

ПРИМЕР СБОРЫ

{
    "id": "5ef6*****",
    "Saledetail": [
      {
        "id": "5ebf*****",
        "quantity": 9,
        "price": 2000,
        "totalline": 18000
      }
    ],
    "datesale": "1593129600000",
    "grandtotal": 18000,
    "user": "5eb9ab******",
    "customer": {
      "name": "isabella"
    },
    "state": "PAID"
  },

РЕЗОЛЬВЕР:

mostSellingProducts: async (_,{},ctx)=>{   
    
                const Products = await invoice.aggregate([
                     { $unwind: "$Saledetail" },
                     { $match: { "state" : 'PAID'}},
                     { $group: {
                        _id : "$Saledetail.id",
                        total: { $sum: '$Saledetail.totalline' }
                    }},
                    {
                        $lookup: {
                            from: 'dhproducts',
                            localField: '_id',
                            foreignField: "_id",
                            as: "producto" 
                        }
                    },
                    {
                        $limit: 4
                    },
                    {
                        $sort : {total: -1}
                    }
                    ]);
                console.log(Products);
                return Products;
   },

Я использовал много методов, которые на самом деле не дали мне такого результата, но, тем не менее, я добился положительного результата с точки зрения поиска моих лучших клиентов, которые на самом деле развивают его с помощью агрегирования, сопоставления и группировки. применить sort и limit ... но с этим примером мне не удалось добиться успеха, и я предполагаю, что это потому, что архитектура коллекции отличается из-за расположения детали покупки

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

под ответом на мой вопрос

mostSellingProducts: async (_,{},ctx)=>{   
    
                const Products = await Invoice.aggregate([
                     { $unwind: "$Saledetail" },
                     { $match: { "state" : 'PAY'}},
                     { $group: {   
                        _id : { $toObjectId: "$Saledetail.id" },
                        total: { $sum: '$Saledetail.totalline' }
                    }},
                    {
                        $lookup: {
                            from: 'dhproducts',
                            localField: '_id',
                            foreignField: "_id",
                            as: "products" 
                        }
                    },
                    {
                        $limit: 4
                    },
                    {
                        $sort : {total: -1}
                    }
                    ]);
                return Products;
   },
0 голосов
/ 09 июля 2020

У меня недостаточно репутации, чтобы прокомментировать ваш вопрос. Я делюсь этим как ответом.

Думаю, вы можете использовать $ elemMatch для поиска элемента в массиве.

const Productos = await Factura.aggregate([{ detlle: { $elemMatch: { $gte: 80, $lt: 85 } } }])

Для получения более подробной информации elemMatch

...