javascript - 统计一个月内子文档mongodb交易中的产品数量
问题描述
下面只是我的 mongodb 文档的一个示例。以及从产品文档中选择交易时sum
我期望的每个交易文档中的产品数量175
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
在您想要的任何内容上添加值:
- 首先必须
$match
“transactionData
大于或等于”所需日期。在这里,您必须使用 JS 计算您的日期并使用变量。 - 然后
$unwind
productsInTransactions
字段解构数组。 $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"
}
}
])
这里的例子
结果是:
[
{
"_id": "61012014f7416b0a41db7055",
"name": "MIE",
"qtyInTransaction": 175,
"retailPrice": 20000
}
]
推荐阅读
- flutter - Flutter:适用于 iOS 和 Android 的可编辑 PDF 查看器
- javascript - 在 React 中,如何从不同组件的事件处理程序触发自定义按钮的单击事件?
- python - 将函数中的文本打印到 tkinter 标签中
- javascript - 距当前时间 30 秒后,显示已过 30 秒的通知
- javascript - 由于不允许的 MIME 类型(“application/wasm”),加载模块被阻止
- python - 将数据添加到仅包含列名的现有空数据框
- android - 我应该如何知道为不同的视图添加什么依赖项?
- firebase - 强制 Firestore 数组与已经是数组一部分的值合并
- python - HexString 到打包的 EBCDIC 字符串
- html - 如何通过特定索引设置文本样式?