找到最接近的家庭住址

时间:2015-09-02 07:48:13

标签: mongodb mongodb-query

假设我的数据库中的一个属性对象如下:

{

    id: ObjectID(454379857349857349545345),
    property_name: 'building 9',
    address_street_1: 'mark street 2',
    address_street_2: 'mark avenue',
    address_city: 'o town',
    address_zip: '687',
    state: 'o state'
}

我需要检查在创建新地址之前是否已经创建了相同/类似地址的属性。如果让我们说新数据的地址是:

property name: 9,
street 1: mark street 2,
street 2: mark ave,
city: O-town,
zip: 687,
state: O-state

1 个答案:

答案 0 :(得分:2)

我个人不会尝试匹配“9号楼”与“9”或任何其他组合相同的东西。它过于宽泛,容易出现逻辑错误,而且编码逻辑也很多。

如果您存储了属性的“地理位置”,那么您实际上可以直接比较您没有添加基本相同的位置数据或“靠近”该位置的距离太小的东西。你可以准确地达到1米的距离,所以通常在几平方米内的任何东西都是“不”,因为它可能是同一个地方,或者至少需要仔细审查。

因此,如果您的数据实际上如下:

{
    _id: ObjectID(454379857349857349545345),
    property_name: 'building 9',
    address_street_1: 'mark street 2',
    address_street_2: 'mark avenue',
    address_city: 'o town',
    address_zip: '687',
    state: 'o state',
    "location": {
        "type": "Point",
        "coordinates": [150.9482,-33.7764991]
    }
}

然后您想通过它的位置数据查看新的商家信息,然后您基本上会使用$nearSphere进行$minDistance查询以过滤掉任何过于接近的内容:

db.collection.find({
    "location": {
        "$nearSphere": {
            "$geometry": {
                "type": "Point",
                 "coordinates": [150.9482,-33.7764991]
            },
            "$minDistance": 20
        }
    }
})

如果最小距离为20米,并且您通常不希望在结果中找到任何内容。但是,如果你这样做,那么它是对返回列表的快速检查,看看这个“看起来”是否是相同的地址,并且可以由“人”处理。

因此,通过一些具体的东西,例如从该位置读取GPS并保存它,然后检查相同的地址就变成了一项简单的任务。

请查看Geospatial Queries and indexes以获取更多信息。

附录

只是认为这实际上是一个有用的搜索结果,所以这里是你如何达到这一点的基本潜台词。

对于问题中“一般描述”这样的系统,您通常有一个“代理人”负责财产清单(原文如此),并且“代理人”正在进行是一个非常合理的假设。在建立新业务的过程中访问该感兴趣的财产。

因此,我想到了两个基本点:

  1. 在这个星球上(在一个合理的工作场景中)是谁携带一部能够计算出当前位置的手机?即使是蜂窝塔信号强度三角测量也应该在合理的米径范围内得到这个,但通常这些“小型计算机”都具有GPS功能,并且还能够与记录其当前位置的应用程序进行交互。

  2. 可能有例外,或者只是“非技术精明的超级销售人员”,他们至少可以“指向地图”(他们实际上是以某种方式找到了这个地方)或者自己解决了这个问题。在办公室中,从界面中选择地图位置。

  3. 考虑到这两个选项中的任何一个,那么用户(或帮助者)将需要完全无能为力,无法以某种方式从呈现的地图中选择属性的位置。嘿,“谷歌”(没有品牌打算)只会根据打字地址的“文字”大部分时间正确。但我们并没有在这里建立“谷歌”(品牌认可),而只是建立一个应用程序。

    在一天结束时,如果人们不能真正“指着地图”,或者使用他们随身携带的GPS,那么让他们手动查看。只需将其列为“设计约束”,直到$ 20K账单获得支付。