【发布时间】:2014-08-31 13:58:40
【问题描述】:
我有一个存储医生信息的集合。每个医生都可以在私人诊所和/或医院工作。 该集合具有以下相关字段(privatePractices.address.loc 和 hospital.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 文档中添加了一个字段用于排序目的,其中包含一个包含医生所有位置的数组。
我在 MongoDB 2.4 和 MongoDB 2.6 中尝试过这种方法,结果不同。 2.4 上的查询返回了具有多个位置的重复医生,即使 _id 包含在查询过滤器中。对 2.6 的查询返回有效结果。
【问题讨论】:
-
建模是这里的问题,因为这个不会为您的预期目的而削减它。也许最好的回答方法是真正了解“找医生”的意思。是否有任何特定的选择标准适用于这些医生?例如特定的“专家类型”或其他东西。我通常认为这里的计划 C 会比您的计划 B 执行得更好
-
我在某些情况下使用其他条件进行查询,但我通常也希望按邻近度排序结果。我对你的 C 计划很感兴趣——那会是什么?
-
@ederbf 您使用“多点”索引还是仅使用“点”?你能分享你的最终文档架构吗?
-
@Zyoo,你说的“多点”是什么意思?我知道的唯一球形指数是“2dsphere”,这就是我使用的。我的解决方案最终与 Neil Lunn 在他的回答中建议的非常相似,他的架构就是一个很好的例子 :)
-
我的意思是geojson类型。最后我用“MultiPoint”保存多个位置,然后通过“Point”查询。类似于stackoverflow.com/questions/31295049/…
标签: mongodb mongodb-query geospatial