我有如下数据:
{
"_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" : [ ] } ] }
用'$$ un.user'替换'$ _id'会显示所有data.one项,因此问题似乎出在$ eq语句中。
如何获取过滤器以显示期望的一个数组?
答案 0 :(得分:1)
您可以使用以下汇总
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"] }
}
}
}}
])