У меня есть модель:
const schema = new mongoose.Schema({
country: { type: String },
code: { type: String },
region: [{
name: { type: String },
city: [{
name: { type: String },
latitude: { type: String },
longitude: { type: String },
}],
}],
})
Мне нужно получить список региона → город → имя (список названий городов) В начале я попытался запросить список города (массива)
const list = await Model.findOne(
{ $and: [{ code: req.params.code }, { 'region.name': 'Harjumaa' }] },
{ 'region.city.name': 1 },
)
И получить эти данные:
Затем я ищу список регионов и отправляю запрос:
Model.findOne({ code: req.params.code }, { region: 1 })
И получать данные так:
Я хочу получить список названий городов в том же формате.
Мой образец данных:
{
"country": "Estonia",
"code": "ee",
"region": [
{
"name": "Harjumaa",
"city": [
{
"name": "Aegviidu vald",
"latitude": "59.27941132",
"longitude": "25.62571907"
},
{
"name": "Anija vald",
"latitude": "59.27643967",
"longitude": "25.48167992"
}
]
}
]
}
$project
с $region.city.name
даст вам массив массивов, так как у вас есть два уровня вложенности. Чтобы исправить это, вы можете использовать $ lower с $ concatArrays, который сведет ваш конечный результат в один массив, попробуйте:
Model.aggregate([
{
$match: { code: "ee" }
},
{
$project: {
cityNames: {
$reduce: {
input: "$region.city.name",
initialValue: [],
in: { $concatArrays: [ "$$this", "$$value" ] }
}
}
}
}
])
Вы можете использовать вложенную map
var a={
"country": "Estonia",
"code": "ee",
"region": [
{
"name": "Harjumaa",
"city": [
{
"name": "Aegviidu vald",
"latitude": "59.27941132",
"longitude": "25.62571907"
},
{
"name": "Anija vald",
"latitude": "59.27643967",
"longitude": "25.48167992"
}
]
}
]
}
console.log(...a.region.map((e)=>e.city.map((x)=>x.name)))