mongodb - 按嵌套数组/对象值(在不同级别上)和 $push 按多个级别过滤 - MongoDB Aggregate
问题描述
我有一个包含多层嵌入子文档的文档,每个文档都有一些嵌套数组。使用 $unwind 和 sort,按天进行降序排序,并使用 push 将每行记录组合成单个数组。此推送仅在一个级别上工作,这意味着它只允许一次推送。如果想在嵌套级别做同样的事情并保留顶层数据,得到“errmsg”:“无法识别的表达式'$push'”。
{
"_id" : ObjectId("5f5638d0ff25e01482432803"),
"name" : "XXXX",
"mobileNo" : 323232323,
"payroll" : [
{
"_id" : ObjectId("5f5638d0ff25e01482432801"),
"month" : "Jan",
"salary" : 18200,
"payrollDetails" : [
{
"day" : "1",
"salary" : 200,
},
{
"day" : "2",
"salary" : 201,
}
]
},
{
"_id" : ObjectId("5f5638d0ff25e01482432802"),
"month" : "Feb",
"salary" : 8300,
"payrollDetails" : [
{
"day" : "1",
"salary" : 300,
},
{
"day" : "2",
"salary" : 400,
}
]
}
],
}
Expected Result:
{
"_id" : ObjectId("5f5638d0ff25e01482432803"),
"name" : "XXXX",
"mobileNo" : 323232323,
"payroll" : [
{
"_id" : ObjectId("5f5638d0ff25e01482432801"),
"month" : "Jan",
"salary" : 18200,
"payrollDetails" : [
{
"day" : "2",
"salary" : 201
},
{
"day" : "1",
"salary" : 200
}
]
},
{
"_id" : ObjectId("5f5638d0ff25e01482432802"),
"month" : "Feb",
"salary" : 8300,
"payrollDetails" : [
{
"day" : "2",
"salary" : 400
},
{
"day" : "1",
"salary" : 300
}
]
}
],
}
只是一天将被排序,其余的东西都是一样的
我试过了,但它得到了无法识别的表达式'$push'
db.employee.aggregate([
{$unwind: '$payroll'},
{$unwind: '$payroll.payrollDetails'},
{$sort: {'payroll.payrollDetails.day': -1}},
{$group: {_id: '$_id', payroll: {$push: {payrollDetails:{$push:
'$payroll.payrollDetails'} }}}}])
解决方案
它需要两次$group
,你不能$push
在一个字段中使用两次运算符,
- $group by main id 和 payroll id,构造
payrollDetails
数组 - $sort by payroll id (如果不需要,你可以跳过)
- $group by main id 并构造
payroll
数组
db.employee.aggregate([
{ $unwind: "$payroll" },
{ $unwind: "$payroll.payrollDetails" },
{ $sort: { "payroll.payrollDetails.day": -1 } },
{
$group: {
_id: {
_id: "$_id",
pid: "$payroll._id"
},
name: { $first: "$name" },
mobileNo: { $first: "$mobileNo" },
payrollDetails: { $push: "$payroll.payrollDetails" },
month: { $first: "$payroll.month" },
salary: { $first: "$payroll.salary" }
}
},
{ $sort: { "payroll._id": -1 } },
{
$group: {
_id: "$_id._id",
name: { $first: "$name" },
mobileNo: { $first: "$mobileNo" },
payroll: {
$push: {
_id: "$_id.pid",
month: "$month",
salary: "$salary",
payrollDetails: "$payrollDetails"
}
}
}
}
])
推荐阅读
- hbase - 如何导出 hbase 的架构
- laravel - 使用 laravel 中的复选框按多个值搜索
- javascript - JS - 将对象转换为数组,除非它是数组
- rest - 无法从 Airflow API 触发 DAG,但可以通过 Curl 命令触发
- javascript - 在渲染方法中无法识别 React js 状态对象
- java - 尝试与肥皂客户端通信时出现意外元素错误
- python - SQLAlchemy:分叉代码中的 automap_base
- ios - 如何将 tableView 标签传递给另一个 viewController 中的名称变量?
- c# - Xamarin Launcher.OpenAsync PDF FileUriExposedException
- yaml - 在 yml 文件中使用变量