显示 mongodb-nodejs 驱动程序中所有获取的文件的总和 [英] displaying sum of all the fetched filed in mongodb-nodejs driver

查看:38
本文介绍了显示 mongodb-nodejs 驱动程序中所有获取的文件的总和的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下收藏:

大师合集:

<代码>{"_id": ObjectId("5e3171af6dd4b53168f8a7b6"),状态":[活动"],类别":[isDealer"],映射客户":[ObjectId("5e1ee75ba102a4638d195c15"),ObjectId("5e1ee75ba102a4638d195c16")ObjectId("5e1ee75ba102a4638d195c17")],电话号码":########9,"name": "经销商 3",经销商SAP代码":63547860}

订单集合:

<代码>{"_id" : ObjectId("5e26be38c13b7149d0a95555"),频率":FR","orderCreatedBy" : ObjectId("5e1ee75ba102a4638d195c15"),"submittedTo" : ObjectId("5e3171af6dd4b53168f8a7b6"),"orderCreatedForDate" : ISODate("2020-01-31T18:30:00Z"),总订单":[{贸易副本":110,"订阅副本":7,免费副本":0,机构副本":0,"_id" : ObjectId("5e293708683f4234a4a49e7c"),"publicationCode" : "TOI","publicationName": "印度时报","editionName": "钦奈市",产品代码":TCE1"},{贸易副本":120,"订阅副本":10,免费副本":0,机构副本":0,"_id" : ObjectId("5e293708683f4234a4a49e7b"),"publicationCode" : "ET","publicationName": "经济时报","editionName": "钦奈市",产品代码":ECE1"}]},{"_id" : ObjectId("5e26be38c13b7149d0a9890v1"),频率":FR","orderCreatedBy" : ObjectId("5e1ee75ba102a4638d195c16"),"submittedTo" : ObjectId("5e3171af6dd4b53168f8a7b6"),"orderCreatedForDate" : ISODate("2020-01-31T18:30:00Z"),总订单":[{贸易副本":190,"订阅副本":20,免费副本":3,机构副本":0,"_id" : ObjectId("5e293708683f4234a4a49e7c"),"publicationCode" : "TOI","publicationName": "印度时报","editionName": "钦奈市",产品代码":TCE1"},{贸易副本":130,"订阅副本":10,免费副本":2,机构副本":1,"_id" : ObjectId("5e293708683f4234a4a49e7b"),"publicationCode" : "ET","publicationName": "经济时报","editionName": "钦奈市",产品代码":ECE1"}]},{"_id" : ObjectId("5e27f736a42d441fe8a8957d"),频率":FR","orderCreatedBy" : ObjectId("5e1ee75ba102a4638d195c15"),"submittedTo" : ObjectId("5e3171af6dd4b53168f8a7b6"),"orderCreatedForDate" : ISODate("2020-01-24T18:30:00Z"),总订单":[{贸易副本":210,订阅副本":14,免费副本":0,机构副本":0,"_id" : ObjectId("5e293708683f4234a4a49e7c"),"publicationCode" : "TOI","publicationName": "印度时报","editionName": "钦奈市",产品代码":TCE1"},{贸易副本":310,"订阅副本":17",免费副本":0,机构副本":0,"_id" : ObjectId("5e293708683f4234a4a49e7b"),"publicationCode" : "ET","publicationName": "经济时报","editionName": "钦奈市",产品代码":ECE1"}]},{"_id" : ObjectId("5e26be38c13b7149d0a9890h"),频率":FR","orderCreatedBy" : ObjectId("5e1ee75ba102a4638d195c16"),"submittedTo" : ObjectId("5e3171af6dd4b53168f8a7b6"),"orderCreatedForDate" : ISODate("2020-01-24T18:30:00Z"),总订单":[{"tradeCopies" : 100,"订阅副本":20,免费副本":4,机构副本":1,"_id" : ObjectId("5e293708683f4234a4a49e7c"),"publicationCode" : "TOI","publicationName": "印度时报","editionName": "钦奈市",产品代码":TCE1"},{贸易副本":90,订阅份数:10,"freeCopies" :3 ,机构副本":1,"_id" : ObjectId("5e293708683f4234a4a49e7b"),"publicationCode" : "ET","publicationName": "经济时报","editionName": "钦奈市",产品代码":ECE1"}]}

这是来自 orders 集合中具有不同日期的 4 个文档的示例(orderCreatedForDate)

文档 1 和 2 是由不同客户 (orderCreatedBy) 为明天的 orderorderCreatedForDate : ISODate("2020-01-31T18:30:00Z") 创建的.>

文档 3 和 4:"_id":ObjectId("5e27f736a42d441fe8a8957d"),orderCreatedForDate : ISODate("2020-01-24T18:30:00Z") 于 D-7 日创建]

我需要做几件事.

  1. 我需要显示所有 {tradeCopies:300,subscriptionCopies:27,freeCopies,institutionalCopies } 与 masters 集合中所有映射客户的 productCode 的总和

  2. 在上述情况下,我还需要显示 D-7 天的 {tradeCopies,subscriptionCopies,freeCopies,institutionalCopies } 的总和,其中 orderCreatedForDate:ISODate("2020-01-24T18:30:00Z")

这是我想要的输出:

<代码>{总订单":[{"productCode": "TCE1",贸易副本":300,订阅副本":27,免费副本":3,机构副本":0,"publicationCode": "TOI","publicationName": "印度时报","editionName": "钦奈市",previousWeekCopies":[{tradeCopies":310,subscriptionCopies":34,"freeCopies": 4, "institutionalCopies": 1,}]},{"productCode": "ECE1",贸易副本":250,订阅副本":20,免费副本":2,机构副本":1,"publicationCode": "ET","publicationName": "经济时报","editionName": "钦奈市",previousWeekCopies":[{tradeCopies":400,subscriptionCopies":27,"freeCopies": 3, "institutionalCopies": 1,}]}]}

如果可以实现,请看看这个.

解决方案

您可以使用聚合管道执行此操作.这是为 Node 导出的代码:

<预><代码>[{'$匹配':{'$或':[{'orderCreatedForDate': new Date('Fri, 31 Jan 2020 05:00:00 GMT')}, {'orderCreatedForDate': new Date('Fri, 24 Jan 2020 05:00:00 GMT')}]}}, {'$放松':{'path': '$totalOrder','includeArrayIndex': '字符串'}}, {'$组':{'_ID': {'productCode': '$totalOrder.productCode','日期':'$orderCreatedForDate'},'贸易副本':{'$sum': '$totalOrder.tradeCopies'},'订阅副本':{'$sum': '$totalOrder.subscriptionCopies'},'免费副本':{'$sum': '$totalOrder.freeCopies'},机构副本":{'$sum': '$totalOrder.institutionalCopies'},'产品代码': {'$last': '$totalOrder.productCode'},'出版物名称':{'$last': '$totalOrder.publicationName'},'版本名称':{'$last': '$totalOrder.editionName'},'发布日期': {'$last': '$orderCreatedForDate'}}}, {'$排序':{'出版日期':1}}, {'$组':{'_id': '$_id.productCode','贸易副本':{'$last': '$tradeCopies'},'上一个交易副本':{'$first': '$tradeCopies'},'订阅副本':{'$last': '$subscriptionCopies'},'previousSubscriptionCopies':{'$first': '$subscriptionCopies'},'机构副本':{'$last': '$institutionalCopies'},'previousInstitutionalCopies':{'$first': '$institutionalCopies'},'免费副本':{'$last': '$freeCopies'},'previousFreeCopies':{'$first': '$freeCopies'},'产品代码': {'$last': '$productCode'},'出版物名称':{'$last': '$publicationName'},'版本名称':{'$last': '$editionName'},'发布日期': {'$last': '$publicationDate'}}}, {'$项目':{'产品代码':1,'出版物名称':1,'版本名称':1,'出版日期':1,'贸易副本':1,'订阅副本':1,'机构副本':1,'免费副本':1,'previousWeekCopies':[{'tradeCopies': '$previousTradeCopies','subscriptionCopies': '$previousSubscriptionCopies','freeCopies': '$previousFreeCopies','institutionalCopies': '$previousInstitutionalCopies'}]}}]

让我们来看看每个阶段发生了什么:

<预><代码>[{$匹配:{$or: [ {orderCreatedForDate: ISODate('2020-01-31T05:00:00.000+00:00')},{orderCreatedForDate: ISODate('2020-01-24T05:00:00.000+00:00')}]}},

我们首先匹配具有我们关心的日期的订单.

 {$展开:{路径:$总订单",包含数组索引:'字符​​串'}},

然后我们展开 totalOrder 数组.这会为每个订单创建一个文档.

<预><代码>{$组:{_id: {productCode: "$totalOrder.productCode", 日期: "$orderCreatedForDate"},贸易副本:{$sum: "$totalOrder.tradeCopies"},订阅副本:{$sum: "$totalOrder.subscriptionCopies"},免费副本:{$sum: "$totalOrder.freeCopies"},机构副本:{$sum: "$totalOrder.institutionalCopies"},productCode: { $last: "$totalOrder.productCode"},出版名称:{ $last:$totalOrder.publicationName"},版本名称: { $last: "$totalOrder.editionName"},发布日期:{ $last:$orderCreatedForDate"}}},

然后我们按产品代码和日期对文档进行分组.这使我们能够生成所需的总和.

<预><代码>{$排序:{出版日期:1}},

然后我们对文档进行排序,以便我们知道旧文档排在最前面.

<预><代码>{$组:{_id: "$_id.productCode",贸易副本:{$last: "$tradeCopies"},以前的交易副本:{$first: "$tradeCopies"},订阅副本:{$last: "$subscriptionCopies"},以前的订阅副本:{$first: "$subscriptionCopies"},机构副本:{$last: "$institutionalCopies"},以前的机构副本:{$first: "$制度副本"},免费副本:{$last: "$freeCopies"},以前的免费副本:{$first: "$freeCopies"},productCode: { $last: "$productCode"},出版物名称:{ $last:$publicationName"},版本名称:{ $last:$版本名称"},发布日期:{ $last:$publicationDate"}}},

接下来,我们按产品代码将文档组合在一起,以便为每个产品代码创建一个文档.

<预><代码>{$项目:{产品代码:1,出版物名称:1,版本名称:1,出版日期:1,贸易副本:1,订阅份数:1,机构份数:1份,免费副本:1,previousWeekCopies: [{tradeCopies: "$previousTradeCopies",subscriptionCopies: "$previousSubscriptionCopies",freeCopies: "$previousFreeCopies",机构副本:$previousInstitutionalCopies"}]}}]

最后,我们以我们需要的格式投影我们需要的字段.

以下是一些屏幕截图,以便您可以直观地看到每个阶段发生的情况.

有关如何在 Node.js 中使用聚合管道的更多信息,请参阅 https://www.mongodb.com/blog/post/quick-start-nodejs--mongodb--how-to-analyze-数据使用聚合框架.我还强烈推荐 MongoDB 大学关于聚合管道的免费课程:https://university.mongodb.com/courses/M121/about

I have these following collections:

masters collection:

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

orders collection:

{
    "_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"  }]
}

This is a sample of 4 documents from the orders collection with different dates(orderCreatedForDate)

Documents 1 and 2 are created for tomorrow's orderorderCreatedForDate : ISODate("2020-01-31T18:30:00Z") by different customers (orderCreatedBy).

Documents 3 and 4: "_id":ObjectId("5e27f736a42d441fe8a8957d"),orderCreatedForDate : ISODate("2020-01-24T18:30:00Z") was created on D-7th]

I need to do several things.

  1. I need to show the sum of all {tradeCopies:300,subscriptionCopies:27,freeCopies,institutionalCopies } against the productCode for all the mappedCustomers in the masters collection

  2. I need to also show the sum of {tradeCopies,subscriptionCopies,freeCopies,institutionalCopies } for D-7th day in the above case where orderCreatedForDate:ISODate("2020-01-24T18:30:00Z")

This is the output I want:

{
    "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,
            }]
        }
    ]
}

Please have a look at this if this can be achieved.

解决方案

You can do this with the aggregation pipeline. Here is the code exported for Node:


    [
      {
        '$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'
            }
          ]
        }
      }
    ]

Let's take a look at what is happening in each stage:


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

We begin by matching for orders that have the dates we care about.

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

Then we unwind the totalOrder array. This creates a document for every order.


    {$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"}
    }}, 

Then we group the documents by product code and date. This allows us to generate the sums we need.


    {$sort: {
      publicationDate: 1
    }}, 

Then we sort our documents so we know that the older documents are first.


    {$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"}
    }}, 

Next we group our documents together by product code so we can create a single document for each product code.


    {$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"
      }
        ]
    }}]

Finally, we project the fields we need in the format we need them.

Here are some screenshots so you can see visually what is happening in each stage.

For more on how to use the aggregation pipeline with Node.js, see https://www.mongodb.com/blog/post/quick-start-nodejs--mongodb--how-to-analyze-data-using-the-aggregation-framework. I also highly recommend MongoDB University's free course on the aggregation pipeline: https://university.mongodb.com/courses/M121/about

这篇关于显示 mongodb-nodejs 驱动程序中所有获取的文件的总和的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆