MongoDB:如何考虑多个字段按距离排序?

ederbf

我有一个收集有关医生信息的馆藏。每位医生都可以在私人诊所和/或医院工作。集合具有以下相关字段(privatePractices.address.loc和hospitals.address.loc上都有地理空间索引):

{
  "name" : "myName",
  "privatePractices" : [{
      "_id": 1,
      "address" : {
        "loc" : {
          "lng" : 2.1608502864837646,
          "lat" : 41.3943977355957
        }
      }
    },
    ...
    ],
  "hospitals" : [{
      "_id": 5,
      "address" : {
        "loc" : {
          "lng" : 2.8192520141601562,
          "lat" : 41.97784423828125
        }
      }
    },
    ...
    ]
}

我正在尝试查询该集合以获取按距给定点的距离排序的医生列表。这就是我被困的地方:

以下查询将返回到$ nearSphere中定义的点的距离按顺序排列的医生列表,仅考虑以下两种位置类型之一:

{ "hospitals.address.loc" : { "$nearSphere" : [2.1933, 41.4008] } }
{ "privatePractices.address.loc" : { "$nearSphere" : [2.1933, 41.4008] } }

我想要的是让就近的医院或私人执业医生(无论最近的是什么)来请医生。是否可以对单个Mongo查询执行此操作?

计划B将使用上面的查询,然后在Mongo之外手动排序结果(例如,使用Linq)。为此,我的两个查询应将每个医院或私人诊所的距离返回到$ nearSphere点。有可能在蒙哥(Mongo)做到吗?

编辑-应用解决方案(MongoDB 2.6):我采用了自己的方法,灵感来自Neil Lunn在他的回答中提出的建议:我在Doctor文档中添加了一个字段以进行排序,其中包含一个包含Doctor所有位置的数组。

我在MongoDB 2.4和MongoDB 2.6中尝试了这种方法,结果却有所不同。即使查询过滤器中包含_id,对2.4的查询也会返回具有多个位置的重复医生。对2.6的查询返回有效结果。

尼尔·伦恩

我本来希望在这里获得更多信息,但基本知识仍然适用。因此,您偶然发现的一般问题是尝试在看似医生文件的地方设置“两个”位置字段。

该方法还有另一个问题。您在文档的数组中有“位置” /创建索引时不会给您错误,但是它也不会像您期望的那样工作。这里最大的问题是,在数组中,您可能会发现文档“包含”最近的位置,但是问题是“哪一个”,因为没有任何事情会影响数组的内容。

不过,核心问题是每个查询不能有多个地理空间索引。但是,要真正获得所需的东西,首先要解决问题,然后将医生基本上固定在这些位置上,反之亦然。

例如,这里是“实践”集合或诸如此类:

{
    "type": "Hospital",
    "address" : {
        "loc" : {
          "lng" : 2.8192520141601562,
          "lat" : 41.97784423828125
        }
    },
    "doctors": [
        { "_id": 1, "name": "doc1", "specialty": "bones" },
        { "_id": 2, "name": "doc2", "specialty": "heart" }       
    ]
}

{
    "type": "Private",
    "address" : {
       "loc" : {
          "lng" : 2.1608502864837646,
          "lat" : 41.3943977355957
       }
    },
    "doctors": [
        { "_id": 1, "name": "doc1", "specialty": "bones" },
        { "_id": 3, "name": "doc3", "specialty": "brain" }
    ]
}

这样做的好处是,您可以将单个类型的集合作为一个集合,并且都位于同一索引中,并且可以简单地获取“类型”,并且可以按距离,范围或您需要的地理查询正确地进行排序。这避免了其他建模形式的问题。

至于“医生”信息,当然,您实际上会为完整的医生信息本身保留一个单独的集合,甚至可能_id还会在其中保留位置文档数组但是这里的要点是,您通常可以“嵌入”这里有用的一些有用搜索信息中,这将对您有所帮助。

这似乎是更好的选择,并且可以从位置内部为医生匹配标准,因为在数组中查找或排序最近的条目是MongoDB本身不支持的,并且会导致您自己在处理结果时应用数学运算。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章