统计一个月内子文档mongodb交易中的产品数量

count product qty in sub document mongodb transaction in one month

下面只是我的 mongodb 文件的一个例子。和 sum 每个交易文件中的产品数量我预计 175 当 select 交易 August 来自产品文件

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

       ]
   }

]

感谢您的帮助,抱歉我的英语不好

您可以使用此查询(根据需要添加 ISODate 值:

  • 第一个 $matchtransactionData 完成,必须“大于或等于”所需日期。在这里你必须使用JS计算你的日期并使用变量。
  • 然后$unwindproductsInTransactions字段解构数组
  • $group 通过 productId$sum qty 值。
  • 稍后,$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"
    }
  }
])

示例here

结果是:

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