投影和筛选双嵌套数组 mongodb
Project and filter double nested array mongodb
{
"id":"",
"data0":"",
"data1":[
{
"data2":[
{
"name":"Man 1",
"_id":"5e8c242f751d0074ca004a"
},
{
"name":"Man 2",
"_id":"605d403dab6100e1395697"
},
{
"name":"Man 3",
"_id":"5e8c2d39751d0074ca0050"
}
]
},
{
"data2":[
{
"name":"Man 4",
"_id":"5ed4efc71224005abea7eb"
},
{
"name":"Man 5",
"_id":"5e8c249539751d04ca0056"
},
{
"name":"Man 6",
"_id":"5e8c239a39751d0074c046"
}
]
}
]
}
上面的文档是我的数据结构。有没有一种方法可以过滤名称为 Man 3 的数组 (data1) 的元素。我只想显示名称值为 Man 3 的数组元素。我有这段代码,但它不起作用。这是示例。
pipeLine.push(
{ $project: {
'data1' : {
$filter: {
input: '$data1.data2',
as: 'test',
cond: { $eq : ['$$test.name', "Man 3" ]}
}
}
}}
)
预期输出是这样的。
{
"id":"",
"data0":"",
"data1":[
{
"data2":[
{
"name":"Man 1",
"_id":"5e8c242f751d0074ca004a"
},
{
"name":"Man 2",
"_id":"605d403dab6100e1395697"
},
{
"name":"Man 3",
"_id":"5e8c2d39751d0074ca0050"
}
]
}
]
}
您应该使用 $in
运算符来检查“Man 3”是否在 data1.data2.name
中,此路径将 return 名称数组。
db.collection.aggregate([
{
$project: {
"data1": {
$filter: {
input: "$data1",
cond: {
$in: [
"Man 3",
"$$this.data2.name"
]
}
}
}
}
}
])
如果您只需要该过滤器,您可以使用 find
查询而不是聚合:
db.collection.find({
"data1.data2.name": "Man 3"
},
{
"id": 1,
"data0": 1,
"data1.data2.$": 1
})
示例here
此外,如果您想要聚合阶段,请使用 $in
而不是 $eq
:
db.collection.aggregate([
{
"$project": {
"id": 1,
"data0": 1,
"data1": {
"$filter": {
"input": "$data1",
"as": "d",
"cond": {
"$in": [
"Man 3",
"$$d.data2.name"
]
}
}
}
}
}
])
示例here
{
"id":"",
"data0":"",
"data1":[
{
"data2":[
{
"name":"Man 1",
"_id":"5e8c242f751d0074ca004a"
},
{
"name":"Man 2",
"_id":"605d403dab6100e1395697"
},
{
"name":"Man 3",
"_id":"5e8c2d39751d0074ca0050"
}
]
},
{
"data2":[
{
"name":"Man 4",
"_id":"5ed4efc71224005abea7eb"
},
{
"name":"Man 5",
"_id":"5e8c249539751d04ca0056"
},
{
"name":"Man 6",
"_id":"5e8c239a39751d0074c046"
}
]
}
]
}
上面的文档是我的数据结构。有没有一种方法可以过滤名称为 Man 3 的数组 (data1) 的元素。我只想显示名称值为 Man 3 的数组元素。我有这段代码,但它不起作用。这是示例。
pipeLine.push(
{ $project: {
'data1' : {
$filter: {
input: '$data1.data2',
as: 'test',
cond: { $eq : ['$$test.name', "Man 3" ]}
}
}
}}
)
预期输出是这样的。
{
"id":"",
"data0":"",
"data1":[
{
"data2":[
{
"name":"Man 1",
"_id":"5e8c242f751d0074ca004a"
},
{
"name":"Man 2",
"_id":"605d403dab6100e1395697"
},
{
"name":"Man 3",
"_id":"5e8c2d39751d0074ca0050"
}
]
}
]
}
您应该使用 $in
运算符来检查“Man 3”是否在 data1.data2.name
中,此路径将 return 名称数组。
db.collection.aggregate([
{
$project: {
"data1": {
$filter: {
input: "$data1",
cond: {
$in: [
"Man 3",
"$$this.data2.name"
]
}
}
}
}
}
])
如果您只需要该过滤器,您可以使用 find
查询而不是聚合:
db.collection.find({
"data1.data2.name": "Man 3"
},
{
"id": 1,
"data0": 1,
"data1.data2.$": 1
})
示例here
此外,如果您想要聚合阶段,请使用 $in
而不是 $eq
:
db.collection.aggregate([
{
"$project": {
"id": 1,
"data0": 1,
"data1": {
"$filter": {
"input": "$data1",
"as": "d",
"cond": {
"$in": [
"Man 3",
"$$d.data2.name"
]
}
}
}
}
}
])
示例here