отображение суммы всех полученных файлов в драйвере mongodb- nodejs - PullRequest
0 голосов
/ 30 января 2020

У меня есть следующие коллекции:

мастера коллекция:

{
    "_id": ObjectId("5e3171af6dd4b53168f8a7b6"),
    "status": ["active"],
    "category": ["isDealer"],
    "mappedCustomers": [
        ObjectId("5e1ee75ba102a4638d195c15"),
        ObjectId("5e1ee75ba102a4638d195c16")
        ObjectId("5e1ee75ba102a4638d195c17")
    ],
    "phoneNo" : ########9,
    "name": "dealer 3",
    "dealerSAPCode": 63547860
}

заказы коллекция:

{
    "_id" : ObjectId("5e26be38c13b7149d0a95555"),
    "frequency" : "FR",
    "orderCreatedBy" : ObjectId("5e1ee75ba102a4638d195c15"),
    "submittedTo" : ObjectId("5e3171af6dd4b53168f8a7b6"),
    "orderCreatedForDate" : ISODate("2020-01-31T18:30:00Z"),
    "totalOrder" : [
        {
            "tradeCopies" : 110,
            "subscriptionCopies":7,
            "freeCopies" : 0,
            "institutionalCopies" : 0,
            "_id" : ObjectId("5e293708683f4234a4a49e7c"),
            "publicationCode" : "TOI",
            "publicationName" : "Times of India",
            "editionName" : "chennai city",
            "productCode" : "TCE1"
        },
        {
            "tradeCopies" : 120,
            "subscriptionCopies":10,
            "freeCopies" : 0,
            "institutionalCopies" : 0,
            "_id" : ObjectId("5e293708683f4234a4a49e7b"),
            "publicationCode" : "ET",
            "publicationName" : "Economic Times",
            "editionName" : "chennai city",
            "productCode" : "ECE1"
        }]
},
{
    "_id" : ObjectId("5e26be38c13b7149d0a9890v1"),
    "frequency" : "FR",
    "orderCreatedBy" : ObjectId("5e1ee75ba102a4638d195c16"),
    "submittedTo" : ObjectId("5e3171af6dd4b53168f8a7b6"),
    "orderCreatedForDate" : ISODate("2020-01-31T18:30:00Z"),
    "totalOrder" : [
        {
            "tradeCopies" : 190,
            "subscriptionCopies":20,
            "freeCopies" : 3,
            "institutionalCopies" : 0,
            "_id" : ObjectId("5e293708683f4234a4a49e7c"),
            "publicationCode" : "TOI",
            "publicationName" : "Times of India",
            "editionName" : "chennai city",
            "productCode" : "TCE1"
        },
        {
            "tradeCopies" : 130,
            "subscriptionCopies":10,
            "freeCopies" : 2,
            "institutionalCopies" : 1,
            "_id" : ObjectId("5e293708683f4234a4a49e7b"),
            "publicationCode" : "ET",
            "publicationName" : "Economic Times",
            "editionName" : "chennai city",
            "productCode" : "ECE1"  }
            ]
},
{
    "_id" : ObjectId("5e27f736a42d441fe8a8957d"),
    "frequency" : "FR",
    "orderCreatedBy" : ObjectId("5e1ee75ba102a4638d195c15"),
    "submittedTo" : ObjectId("5e3171af6dd4b53168f8a7b6"),
    "orderCreatedForDate" : ISODate("2020-01-24T18:30:00Z"),
    "totalOrder" : [
    {
        "tradeCopies" : 210,
        "subscriptionCopies":14,
        "freeCopies" : 0,
        "institutionalCopies" : 0,
        "_id" : ObjectId("5e293708683f4234a4a49e7c"),
        "publicationCode" : "TOI",
        "publicationName" : "Times of India",
        "editionName" : "chennai city",
        "productCode" : "TCE1"
    },
    {
        "tradeCopies" : 310,
        "subscriptionCopies":17",
        "freeCopies" : 0,
        "institutionalCopies" : 0,
        "_id" : ObjectId("5e293708683f4234a4a49e7b"),
        "publicationCode" : "ET",
        "publicationName" : "Economic Times",
        "editionName" : "chennai city",
        "productCode" : "ECE1"
    }]
},
{
    "_id" : ObjectId("5e26be38c13b7149d0a9890h"),
    "frequency" : "FR",
    "orderCreatedBy" : ObjectId("5e1ee75ba102a4638d195c16"),
    "submittedTo" : ObjectId("5e3171af6dd4b53168f8a7b6"),
    "orderCreatedForDate" : ISODate("2020-01-24T18:30:00Z"),
    "totalOrder" : [
    {
        "tradeCopies" : 100,
        "subscriptionCopies":20,
        "freeCopies" : 4,
        "institutionalCopies" : 1,
        "_id" : ObjectId("5e293708683f4234a4a49e7c"),
        "publicationCode" : "TOI",
        "publicationName" : "Times of India",
        "editionName" : "chennai city",
        "productCode" : "TCE1"
    },
    {
        "tradeCopies" : 90,
        "subscriptionCopies:10,
            "freeCopies" :3 ,
    "institutionalCopies" : 1,
    "_id" : ObjectId("5e293708683f4234a4a49e7b"),
    "publicationCode" : "ET",
    "publicationName" : "Economic Times",
    "editionName" : "chennai city",
    "productCode" : "ECE1"  }]
}

Это образец из 4 документов из коллекции заказов с разными датами (orderCreatedForDate)

Документы 1 и 2 созданы для завтрашнего orderorderCreatedForDate : ISODate("2020-01-31T18:30:00Z") разными клиентами (orderCreatedBy).

Документы 3 и 4: "_id":ObjectId("5e27f736a42d441fe8a8957d"),orderCreatedForDate : ISODate("2020-01-24T18:30:00Z") был создан на 7-й день]

Мне нужно сделать несколько вещей.

  1. Мне нужно показать сумму всех {tradeCopies: 300, subscriptionCopies: 27, freeCopies, институциональные копии} против productCode для всех сопоставленных клиентов в коллекции мастеров

  2. Мне также нужно показать сумму {tradeCopies, subscriptionCopies , freeCopies, институциональные копии} на D-7-й день в приведенном выше случае, где orderCreatedForDate:ISODate("2020-01-24T18:30:00Z")

Это вывод, который я хочу:

{
    "totalOrder": [
        {
            "productCode": "TCE1",
            "tradeCopies": 300,
            "subscriptionCopies": 27,
            "freeCopies": 3,
            "institutionalCopies": 0,
            "publicationCode": "TOI",
            "publicationName": "Times of India",
            "editionName": "chennai city",
            "previousWeekCopies": [{
                "tradeCopies": 310, "subscriptionCopies": 34,
                "freeCopies": 4, "institutionalCopies": 1,
            }]
        },
        {
            "productCode": "ECE1",
            "tradeCopies": 250,
            "subscriptionCopies": 20,
            "freeCopies": 2,
            "institutionalCopies": 1,
            "publicationCode": "ET",
            "publicationName": "Economic Times",
            "editionName": "chennai city",
            "previousWeekCopies": [{
                "tradeCopies": 400, "subscriptionCopies": 27,
                "freeCopies": 3, "institutionalCopies": 1,
            }]
        }
    ]
}

Пожалуйста, посмотрите на это, если это может быть достигнуто.

1 Ответ

1 голос
/ 30 января 2020

Вы можете сделать это с помощью конвейера агрегации. Вот код, экспортированный для узла:


    [
      {
        '$match': {
          '$or': [
            {
              'orderCreatedForDate': new Date('Fri, 31 Jan 2020 05:00:00 GMT')
            }, {
              'orderCreatedForDate': new Date('Fri, 24 Jan 2020 05:00:00 GMT')
            }
          ]
        }
      }, {
        '$unwind': {
          'path': '$totalOrder', 
          'includeArrayIndex': 'string'
        }
      }, {
        '$group': {
          '_id': {
            'productCode': '$totalOrder.productCode', 
            'date': '$orderCreatedForDate'
          }, 
          'tradeCopies': {
            '$sum': '$totalOrder.tradeCopies'
          }, 
          'subscriptionCopies': {
            '$sum': '$totalOrder.subscriptionCopies'
          }, 
          'freeCopies': {
            '$sum': '$totalOrder.freeCopies'
          }, 
          'institutionalCopies': {
            '$sum': '$totalOrder.institutionalCopies'
          }, 
          'productCode': {
            '$last': '$totalOrder.productCode'
          }, 
          'publicationName': {
            '$last': '$totalOrder.publicationName'
          }, 
          'editionName': {
            '$last': '$totalOrder.editionName'
          }, 
          'publicationDate': {
            '$last': '$orderCreatedForDate'
          }
        }
      }, {
        '$sort': {
          'publicationDate': 1
        }
      }, {
        '$group': {
          '_id': '$_id.productCode', 
          'tradeCopies': {
            '$last': '$tradeCopies'
          }, 
          'previousTradeCopies': {
            '$first': '$tradeCopies'
          }, 
          'subscriptionCopies': {
            '$last': '$subscriptionCopies'
          }, 
          'previousSubscriptionCopies': {
            '$first': '$subscriptionCopies'
          }, 
          'institutionalCopies': {
            '$last': '$institutionalCopies'
          }, 
          'previousInstitutionalCopies': {
            '$first': '$institutionalCopies'
          }, 
          'freeCopies': {
            '$last': '$freeCopies'
          }, 
          'previousFreeCopies': {
            '$first': '$freeCopies'
          }, 
          'productCode': {
            '$last': '$productCode'
          }, 
          'publicationName': {
            '$last': '$publicationName'
          }, 
          'editionName': {
            '$last': '$editionName'
          }, 
          'publicationDate': {
            '$last': '$publicationDate'
          }
        }
      }, {
        '$project': {
          'productCode': 1, 
          'publicationName': 1, 
          'editionName': 1, 
          'publicationDate': 1, 
          'tradeCopies': 1, 
          'subscriptionCopies': 1, 
          'institutionalCopies': 1, 
          'freeCopies': 1, 
          'previousWeekCopies': [
            {
              'tradeCopies': '$previousTradeCopies', 
              'subscriptionCopies': '$previousSubscriptionCopies', 
              'freeCopies': '$previousFreeCopies', 
              'institutionalCopies': '$previousInstitutionalCopies'
            }
          ]
        }
      }
    ]

Давайте посмотрим, что происходит на каждом этапе:


    [{$match: {
      $or: [ {orderCreatedForDate: ISODate('2020-01-31T05:00:00.000+00:00')},
      {orderCreatedForDate: ISODate('2020-01-24T05:00:00.000+00:00')}]
    }}, 

Мы начнем с сопоставления заказов, которые имеют даты, которые мы заботимся около.

    {$unwind: {
      path: "$totalOrder",
      includeArrayIndex: 'string'
    }}, 

Затем мы раскручиваем массив totalOrder. Это создает документ для каждого заказа.


    {$group: {
      _id: {productCode: "$totalOrder.productCode", date: "$orderCreatedForDate"},
      tradeCopies: {
        $sum: "$totalOrder.tradeCopies"
      },
      subscriptionCopies: {
        $sum: "$totalOrder.subscriptionCopies"
      },
      freeCopies: {
        $sum: "$totalOrder.freeCopies"
      },
      institutionalCopies: {
        $sum: "$totalOrder.institutionalCopies"
      },
      productCode: { $last: "$totalOrder.productCode"},
      publicationName: { $last: "$totalOrder.publicationName"},
      editionName: { $last: "$totalOrder.editionName"},
      publicationDate: { $last: "$orderCreatedForDate"}
    }}, 

Затем мы группируем документы по коду продукта и дате. Это позволяет нам генерировать необходимые суммы.


    {$sort: {
      publicationDate: 1
    }}, 

Затем мы сортируем наши документы, чтобы мы знали, что более старые документы являются первыми.


    {$group: {
      _id: "$_id.productCode",
      tradeCopies: {
        $last: "$tradeCopies"
      },
      previousTradeCopies: {
        $first: "$tradeCopies"
      },
      subscriptionCopies: {
        $last: "$subscriptionCopies"
      },
      previousSubscriptionCopies: {
        $first: "$subscriptionCopies"
      },
      institutionalCopies: {
        $last: "$institutionalCopies"
      },
      previousInstitutionalCopies: {
        $first: "$institutionalCopies"
      },
      freeCopies: {
        $last: "$freeCopies"
      },
      previousFreeCopies: {
        $first: "$freeCopies"
      },
      productCode: { $last: "$productCode"},
      publicationName: { $last: "$publicationName"},
      editionName: { $last: "$editionName"},
      publicationDate: { $last: "$publicationDate"}
    }}, 

Затем мы группируем наши документы по код продукта, чтобы мы могли создать отдельный документ для каждого кода продукта.


    {$project: {
      productCode: 1,
      publicationName: 1,
      editionName: 1,
      publicationDate: 1,
      tradeCopies: 1,
      subscriptionCopies: 1,
      institutionalCopies: 1,
      freeCopies: 1,
      previousWeekCopies: [{
        tradeCopies: "$previousTradeCopies",
        subscriptionCopies: "$previousSubscriptionCopies",
        freeCopies: "$previousFreeCopies",
        institutionalCopies: "$previousInstitutionalCopies"
      }
        ]
    }}]

Наконец, мы проецируем нужные нам поля в нужном нам формате.

Вот несколько скриншотов, чтобы вы могли наглядно увидеть, что происходит на каждом этапе. agg pipeline visualization agg pipeline visualization

Подробнее об использовании конвейера агрегации с Node.js см. https://www.mongodb.com/blog/post/quick-start-nodejs--mongodb--how-to-analyze-data-using-the-aggregation-framework. Я также настоятельно рекомендую бесплатный курс университета MongoDB по конвейерному агрегации: https://university.mongodb.com/courses/M121/about

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...