问题描述
我有以下收藏
[
{
"Array1": [
{
"Array2": [
{
"name": "6666",
"Array3": [
{ "_id": 128938120, "nest": "samsung" },
{ "_id": 12803918239, "nest": "nokia" }
]
},
{
"name": "5555",
"Array3": [
{ "_id": 48102938109, "nest": "iphone" },
{ "_id": 501293890, "nest": "micromax" }
]
}
],
"name": "old apartment"
},
{
"Array2": [
{
"_id": 410923810,
"name": "3333",
"Array3": [
{ "_id": 48102938190, "nest": "airtel" },
{ "_id": 48102938190, "nest": "jio" }
]
},
{
"_id": 41092381029,
"name": "2222",
"Array3": [
{ "_id": 10293182309, "nest": "master" },
{ "_id": 38190238, "nest": "cub" }
]
}
],
"name": "new apartment"
}
]
}
]
我想将 $filter
设置为 3 个嵌套级别...我只想要第三个数组中的 nokia
元素和第二个数组中的 6666
元素和 旧公寓
从第一个
I want to fo $filter
to 3 nested level... I want only nokia
element from 3rd array and 6666
element from second and old apartment
from the first
我想要这个输出
[
{
"Array1": [
{
"Array2": [
{
"name": "6666",
"Array3": [
{
"_id": 12803918239,
"nest": "nokia"
}
]
}
],
"name": "old apartment"
}
]
}
]
我也想只使用 $filter
和 $map
...不想在这里使用 $unwind
And also I want to do using $filter
and $map
only... Don't want to use $unwind
here
推荐答案
基本上你必须为每个级别使用 $filter
来应用你的条件和每个级别的 $map
内部有嵌套数组的数组.那是因为您想将过滤后的数组传递给输出.所以会有 3
过滤器和 2
映射.在这种情况下,缩进可能真的很有帮助.试试:
Basically you have to use $filter
for each level to apply your condition and $map
for each array that has nested array inside. That's because you want to pass filtered array to the output. So there will be 3
filters and 2
maps. Indentations might be really helpful in this case. Try:
db.collection.aggregate([
{
$project: {
Array1: {
$map: {
input: { $filter: { input: "$Array1", as: "a1", cond: { $eq: ["$$a1.name", "old apartment" ] } } },
as: "a1",
in: {
name: "$$a1.name",
Array2: {
$map: {
input: { $filter: { input: "$$a1.Array2", as: "a2", cond: { $eq: [ "$$a2.name", "6666" ] } } },
as: "a2",
in: {
name: "$$a2.name",
Array3: { $filter: { input: "$$a2.Array3", as: "a3", cond: { $eq: [ "$$a3.nest", "nokia" ] } } }
}
}
}
}
}
}
}
}
])
Mongo 游乐场
这篇关于$filter 在 mongodb 中最多 3 个嵌套级别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!