mongodb - 如何在MongoDB中获取每个月的最后一个值?
问题描述
我的数据库中有三个字段id
,date
和qty
。我想按 对它们进行分组id
并找到qty
每个月的最新数量。因此,对于每个月,每个月date
的最后一天,qty
都会为其返回 。
如果输入是
[
{
"id": "ABC",
"date": "2020-10-02 15:03:00.00",
"qty": 500,
},
{
"id": "ABC",
"date": "2020-10-31 20:22:00.00",
"qty": 100,
},
{
"id": "ABC",
"date": "2020-11-03 04:22:00.00",
"qty": 200,
},
{
"id": "ABC",
"date": "2020-11-18 04:22:00.00",
"qty": 50,
},
{
"id": "ABC1",
"date": "2020-11-05 04:22:00.00",
"qty": 5000,
},
{
"id": "ABC1",
"date": "2020-11-15 04:22:00.00",
"qty": 4580,
},
]
那么输出应该是
[
{
"id": "ABC",
"qtys": [
{
"date": "2020-10-31 20:22:00.00",
"qty": 100
},
{
"date": "2020-11-18 04:22:00.00",
"qty": 50
}
]
},
{
"id": "ABC1",
"qtys": [
{
"date": "2020-11-15 04:22:00.00",
"qty": 4580
}
]
},
]
解决方案
$addFields
将date
字段从字符串类型转换为日期类型,如果它已经是日期类型,则忽略此阶段$sort
按date
降序排列$group
byid
,month
andyear
从date
字段中提取后使用$year
and$month
获取第一个文档$group
仅由id
并构造数量数组qtys
db.collection.aggregate([
{ $addFields: { date: { $toDate: "$date" } } },
{ $sort: { date: -1 } },
{
$group: {
_id: {
id: "$id",
month: { $month: "$date" },
year: { $year: "$date" }
},
qtys: { $first: { date: "$date", qty: "$qty" } }
}
},
{
$group: {
_id: "$_id.id",
qtys: { $push: "$qtys" }
}
}
])
推荐阅读
- python - Pip panda 安装抛出大错误?
- ios - 无法创建 3 列 UICollectionView
- javascript - 在 Node.JS 中打开多个进程
- botframework - 如何在现代 SharePoint Online 页面中启用 Webchat 频道的语音功能?
- json - 基于类型键解组动态 JSON
- php - 在 php 数组中将键 [0] 更改为 [Name]?
- python - 字母频率替换密码
- python - lxml/python 读取带有 CDATA 部分的 xml
- elasticsearch - 无痛:检查单个文档是否包含密钥
- android - 在 Gradle 构建中引用变量