Javascript MongoDB在嵌套数组聚合中查找
我在下面解释了嵌套数组文档:Javascript MongoDB在嵌套数组聚合中查找,javascript,node.js,mongodb,mongoose,aggregation-framework,Javascript,Node.js,Mongodb,Mongoose,Aggregation Framework,我在下面解释了嵌套数组文档: countries: [ { "id": "id of country", "cities": [ { "id": "id of city 1", "areas": [ { "id": "id of area 1
countries: [
{
"id": "id of country",
"cities": [
{
"id": "id of city 1",
"areas": [
{
"id": "id of area 1"
},
{
"id": "id of area 2"
},
{
"id": "id of area 3"
},
{
"id": "id of area 4"
}
]
},
{
"id": "id of city 2",
"areas": [
{
"id": "id of area 1"
},
{
"id": "id of area 2"
},
{
"id": "id of area 3"
},
{
"id": "id of area 4"
}
]
}
]
}
]
我的目标是使用$addFields
添加一个字段,以指示给定的id是否与区域id匹配
{$addFields: {
isDeliveringToArea: {
$in: [ObjectId('5db5d11cb18a2500129732a5'),'$countries.cities.areas.id']
}
}}
但是显然,$in
不适用于嵌套数组。
我希望find方法类似于Model.find({'countries.cities.areas.id':'areaID'})但要在聚合中返回布尔值。由于有3级嵌套数组,我们可以使用
$map
实现这一点,该方法用于运行/修改所有对象。第一个$map
用于遍历每个国家对象,第二个$map
用于遍历每个国家对象内的每个城市对象
更新1
由于您需要所有字段,因此可以使用$anyElementTrue
执行此操作,如果在我们的条件下有任何元素为true,它将发出true
工作
我保留旧的查询供您参考。
工作@turivishal在管道聚合中感谢,@varman的帮助,但我需要将isDeliveringToArea添加到主要文件中,而不是添加到国家的每个元素中,类似于此[{id:1,国家:[……],isDeliveringToArea:true},{id:2,国家:[……],isDeliveringToArea:false}]
[
{
"$addFields": {
isDeliveringToArea: {
$anyElementTrue: {
$map: {
input: "$countries",
in: {
$anyElementTrue: {
$map: {
input: "$$this.cities",
in: {
$in: [
"6",
"$$this.areas.id"
]
}
}
}
}
}
}
}
}
}
]