代码之家  ›  专栏  ›  技术社区  ›  Sergei R

如何从嵌套数组中查找数据?

  •  1
  • Sergei R  · 技术社区  · 5 年前

    我有一个模型:

    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 },
    )
    

    并接收这些数据:

    enter image description here

    然后我搜索发送查询的区域列表:

    Model.findOne({ code: req.params.code }, { region: 1 })
    

    接收这样的数据:

    enter image description here

    我想得到相同格式的城市名称列表。

    我的数据样本:

    {
      "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"
            }
          ]
        }
      ]
    }
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   mickl    5 年前

    $project 具有 $region.city.name 路径将为您提供一个数组数组,因为您有两个嵌套级别。修复你可以使用的 $reduce 具有 $concatArrays 这将使最终结果变平为单个数组,请尝试:

    Model.aggregate([
        {
            $match: { code: "ee" }
        },
        {
            $project: {
                cityNames: {
                    $reduce: {
                        input: "$region.city.name",
                        initialValue: [],
                        in: { $concatArrays: [ "$$this", "$$value" ] }
                    }
                }
            }
        }
    ])