首页 > 解决方案 > 统计一个月内子文档mongodb交易中的产品数量

问题描述

下面只是我的 mongodb 文档的一个示例。以及从产品文档中选择交易时sum我期望的每个交易文档中的产品数量175August

products文件中的预期结果

[
 {
   "_id":"61012014f7416b0a41db7055",
   "name":"MIE",
   "retailPrice":20000,
   "qtyInTransaction":175
 }
]

这是我的文件

products文档

[
 {
   "_id":"61012014f7416b0a41db7055",
   "name":"MIE",
   "retailPrice":20000,
   "description":"PRODUK BARU",
 }
]

producutInTransaction文档

 [
  {
    "_id":"6106a3b1f1bbd62640c7b404",
    "transactionDate":{"$date":"2021-08-01T00:00:00.000Z"},
    "productsInTransactions":
         [
            {
             "_id":"6106a3cff1bbd62640c7b405",
             "productId":"61012014f7416b0a41db7055"},
             "qty":100,
             "price":5000,
             "description":"asdn"
           },
            {
             "_id":"6106a3cff1bbd62640c7b406",
             "productId":"61012014f7416b0a41db7055"},
             "qty":50,
             "price":5000,
             "description":"asdn"
           }

       ]
   },
  {
    "_id":"6106a3b1f1bbd62640c7b4007",
    "transactionDate":{"$date":"2021-08-01T00:00:00.000Z"},
    "productsInTransactions":
         [
            {
             "_id":"6106a3cff1bbd62640c7b407",
             "productId":"61012014f7416b0a41db7055"},
             "qty":25,
             "price":5000,
             "description":"asdn"
           },

       ]
   }

]

感谢您的帮助,对不起我的英语

标签: javascriptmongodbnosql

解决方案


您可以使用此查询(ISODate在您想要的任何内容上添加值:

  • 首先必须$matchtransactionData大于或等于”所需日期。在这里,您必须使用 JS 计算您的日期并使用变量。
  • 然后$unwind productsInTransactions字段解构数组。
  • $group通过productId和价值$sumqty
  • 稍后,$lookup与“产品”集合“加入”并生成data具有所需值的字段。
  • 并且至少$project只显示您想要的字段。
db.productInTransaction.aggregate([
  {
    "$match": {
      "transactionDate": {
        "$gte": ISODate("2021-07-01T00:00:00.000Z")
      }
    }
  },
  {
    "$unwind": "$productsInTransactions"
  },
  {
    "$group": {
      "_id": "$productsInTransactions.productId",
      "qty": {
        "$sum": "$productsInTransactions.qty"
      }
    }
  },
  {
    "$lookup": {
      "from": "product",
      "localField": "_id",
      "foreignField": "_id",
      "as": "data"
    }
  },
  {
    "$project": {
      "name": {
        "$arrayElemAt": [
          "$data.name",
          0
        ]
      },
      "retailPrice": {
        "$arrayElemAt": [
          "$data.retailPrice",
          0
        ]
      },
      "qtyInTransaction": "$qty"
    }
  }
])

这里的例子

结果是:

[
  {
    "_id": "61012014f7416b0a41db7055",
    "name": "MIE",
    "qtyInTransaction": 175,
    "retailPrice": 20000
  }
]

推荐阅读