mongodb - 使用 $objectToArray 压缩一个文档中的数据
问题描述
我有多个订单日志文档,我正在尝试使用 $objectToArray 将它们压缩到一个文档中。下面是我想要弄清楚的集合和输出。我还包括我的查询,但它不压缩数据。
{
"ordernumber": 21001,
"ordername":"testorder1",
"status" : "Ordered",
"modifiedat" : ISODate("2021-06-30T17:02:17.165Z")
},
{
"ordernumber": 21001,
"ordername":"testorder1",
"status" : "Order Received",
"modifiedat" : ISODate("2021-07-01T03:57:47.533Z")
},
{
"ordernumber": 21001,
"ordername":"testorder1",
"status" : "Delivered",
"modifiedat" : ISODate("2021-08-17T23:53:24.878Z")
},
{
"ordernumber": 21002,
"ordername":"testorder2",
"status" : "Ordered",
"modifiedat" : ISODate("2021-07-17T23:53:24.878Z")
},
{
"ordernumber": 21002,
"ordername":"testorder2",
"status" : "Order Received",
"modifiedat" : ISODate("2021-07-19T04:07:47.686Z")
},
{
"ordernumber": 21002,
"ordername":"testorder2",
"status" : "Order Cancelled",
"modifiedat" : ISODate("2021-07-20T15:42:23.123Z")
},
每个订单号应包含一个文档输出中的所有日志:
{
"ordernumber": 21001,
"ordername":"testorder1",
"orderlogs": [
{
"status" : "Ordered",
"modifiedat" : ISODate("2021-06-30T17:02:17.165Z")
},
{
"status" : "Order Received",
"modifiedat" : ISODate("2021-07-01T03:57:47.533Z")
},
{
"status" : "Delivered",
"modifiedat" : ISODate("2021-08-17T23:53:24.878Z")
}
]
},
{
"ordernumber": 21002,
"ordername":"testorder2",
"orderlogs": [
{
"status" : "Ordered",
"modifiedat" : ISODate("2021-07-17T23:53:24.878Z")
},
{
"status" : "Order Received",
"modifiedat" : ISODate("2021-07-19T04:07:47.686Z")
},
{
"status" : "Order Cancelled",
"modifiedat" : ISODate("2021-07-20T15:42:23.123Z")
}
]
},
我创建了一个查询,但每个文档只返回一个数组。(仍在多个文档中)
{
$project: {
ordernumber: "$ordernumber",
ordername:"$ordername",
orderlogs:
{$objectToArray: {
status:"$status",
modifiedat: "$modifiedat"
}
}
}
}
解决方案
$addFields
- 将当前文档添加$$ROOT
到新字段中,orderlog
.$project
- 不显示_id
,ordernumber
,ordername
fororderlog
$group
ordernumber
- 按和分组ordername
$project
- 显示ordernumber
,ordername
,orderlog
字段
db.collection.aggregate([
{
"$addFields": {
"orderlog": "$$ROOT"
}
},
{
$project: {
"orderlog": {
"_id": 0,
"ordernumber": 0,
"ordername": 0
}
}
},
{
$group: {
_id: {
ordernumber: "$ordernumber",
ordername: "$ordername"
},
orderlogs: {
$push: "$orderlog"
}
}
},
{
$project: {
_id: 0,
ordernumber: "$_id.ordernumber",
ordername: "$_id.ordername",
orderlogs: "$orderlogs"
}
}
])
推荐阅读
- gremlin - Why is hasId() only returning one of the ids in a list?
- python-3.x - 无法使用 pandas 和 selenium 从网站获取表格
- c# - 将字节数组复制到位图时,LockBits 似乎导致步幅错误
- c# - 在一个非常复杂的多任务窗口窗体程序中锁定和使用实体框架上下文是否可以?
- api - GitHub API - 如何将问题移至项目?
- discord.py-rewrite - Piece of code looping, and i don't know how to solve it
- c - 生成子进程以写入日志文件
- perl - Perl:按长度顺序打印文件的行,等长的行应按字母顺序排序
- javascript - info.selectionText 未定义 - chrome 扩展
- c# - 在返回之前使用 DBContext 访问启动长时间运行的进程