【问题标题】:MongoDB | Listing the Zip Code/Postal Code for each City in New YorkMongoDB |列出纽约每个城市的邮政编码/邮政编码
【发布时间】:2021-12-24 07:55:25
【问题描述】:

作为我个人项目的一部分,我正在学习如何编写 MongoDB 查询。我想我遗漏了一些小东西或大东西(我不知道),并希望有人能指出我的 MongoDB 查询出了什么问题。我正在研究 MongoDB 上提供的流行邮政编码数据集:https://docs.mongodb.com/manual/tutorial/aggregation-zip-code-data-set/

zipcodes 集合中的文档示例具有以下形式:

{
  "_id": "10280",
  "city": "NEW YORK",
  "state": "NY",
  "pop": 5574,
  "loc": [
    -74.016323,
    40.710537
  ]
}

目标:我正在尝试查找纽约州 (NY) 的每个城市的人口,其中的结果列出了 每个 中包含的邮​​政编码城市。输出应如下所示:

{
    _id : "ELMIRA",
    population : <population of ELMIRA>,
    postal_codes : [
        <PostalCode1 in ELMIRE>,
        <PostalCode2 in ELMIRE>,
        <PostalCode3 in ELMIRA>
        ]
    },
    {
        _id : "WHITESVILLE",
        population : <population of WHITESVILLE>,
        postal_codes : [
            <PostalCode1 in WHITESVILLE>
        ]
    },

我的代码:这是我目前写的内容

db.getCollection('codes').aggregate([
    { 
        $group: {
            _id: {city: "$city", state:"$state"},
            population: {$sum: "$pop"},
            postal_codes: {$addToSet: "$_id"}
        }
    },
    {
        $match: {
            "_id.state":"NY"
        
        }
    
    },
    {
        $group: {
            _id: "$_id.city",
            population: {$last: "$population"},
            postal_codes: {$last: "$postal_codes"}
        }
    }       
])

问题 - 我在代码中看到的问题是,它只列出了纽约一个具有多个邮政编码的城市的 一个 邮政编码,如如下图所示。在美国,一个城市可能会重叠多个邮政编码。如何修复我的查询以包含纽约每个城市的所有个邮政编码,而不是其中一个?

{ 
    "_id" : "OSSINING", 
    "population" : NumberInt(29926), 
    "postal_codes" : [
        "10562"
    ]
}
{ 
    "_id" : "COLD SPRING", 
    "population" : NumberInt(4904), 
    "postal_codes" : [
        "10516"
    ]
}
{ 
    "_id" : "NORTH WOODMERE", 
    "population" : NumberInt(19582), 
    "postal_codes" : [
        "11581"
    ]
}

【问题讨论】:

  • this 你在找什么?数据集非常大,所以我只能抽取几个文档进行测试。
  • 问题是你在这一行使用了 $last 。邮政编码:{$last: "$postal_codes"}。 $last 是一个数组运算符,只返回数组的最终值。将 $last 更改为 $push,这样每个邮政编码都会添加,您应该没问题。
  • @RubénVega,感谢您的评论。让我将其更改为 $push 并测试更改。我会检查它是否能解决问题。
  • @ray,是的,我正在寻找类似于您在 Mongo 代码中的内容。

标签: arrays database mongodb mongodb-query


【解决方案1】:

您可以简单地使用$addToset 而不是$last 来获取所有postal_codes

附注:您可以通过将$match 推送到state 到更早阶段来减少中间结果集,从而使您的代码更高效。

db.collection.aggregate([
  {
    $match: {
      "state": "NY"
    }
  },
  {
    $group: {
      _id: "$city",
      population: {
        $sum: "$pop"
      },
      postal_codes: {
        $addToSet: "$_id"
      }
    }
  }
])

这是Mongo playground 供您参考。

【讨论】:

    猜你喜欢
    • 2013-09-22
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 2013-08-16
    • 2018-09-21
    • 1970-01-01
    相关资源
    最近更新 更多