mongodb - 如何修复 MongoDB 聚合 $project $filter
问题描述
我的数据如下所示:
{
"_id" : 1,
"data" : [
{
"id" : 1,
"one" : [
{"user" : 2, "two" : 2},
{"user" : 1, "two" : 3}
]
}
]
}
{
"_id" : 2,
"data" : [
{
"id" : 2,
"one" : [
{"user" : 2, "two" : 2},
{"user" : 1, "two" : 3}
]
}
]
}
我想在一个聚合中进行过滤(因为上面的数据来自之前的阶段),以便过滤一个数组以仅显示一个数组项,其中用户等于_id。
以下返回一个空数组,如何让过滤器按我的预期填充一个数组?
db.parks.aggregate([{$project: {_id: 1, 'data.id': 1, 'data.one':
{$filter: {
input: '$data.one',
as: 'un',
cond: {$eq: ['$$un.user', '$_id']}}
}}}]).pretty()
这使:
{ "_id" : 1, "data" : [ { "id" : 1, "one" : [ ] } ] }
{ "_id" : 2, "data" : [ { "id" : 2, "one" : [ ] } ] }
将 '$_id' 替换为 '$$un.user' 会按预期显示所有 data.one 项目,因此看起来问题出在 $eq 语句中。
如何让过滤器按预期显示一个数组?
解决方案
您可以使用以下聚合
db.collection.aggregate([
{ "$project": {
"data": {
"$filter": {
"input": {
"$map": {
"input": "$data",
"in": {
"id": "$$this.id",
"one": {
"$filter": {
"input": "$$this.one",
"as": "on",
"cond": { "$eq": ["$$on.user", "$_id"] }
}
}
}
}
},
"as": "d",
"cond": { "$eq": ["$$d.id", "$_id"] }
}
}
}}
])
推荐阅读
- java - Java:搜索两个字符串之间的第一个公共字符
- python - 如何仅将字符串数组的整数转换为numpy中的浮点数组?
- json - 如何从 api.weather.gov 获取德克萨斯车站或区域或办公室或网格点或其他任何东西的每小时预报?
- css - 如何应用 object-fit: 也包含到 div?
- symfony4 - @Assert\Choice(callback="...") 是否仅适用于表单构建器?
- kubernetes - 如何将 Windows docker 容器部署到 docker-for-desktop Kubernetes 集群?拉取访问被拒绝
- autodesk-viewer - 恢复状态下的剖切平面工具位置错误
- c# - 带有表达式的 EF LINQ 查询:预期方法名称 - 如何将表达式传递给函数以在 EF 查询中使用?
- reactjs - 如何仅在 ReactJS 中的组件上使用 reactstrap?
- c++ - 未调用 mosquitto c API 的回调函数