$near $unwind MongoDB 地理空间
Posted
技术标签:
【中文标题】$near $unwind MongoDB 地理空间【英文标题】:$near $unwind mongodb geospatial 【发布时间】:2013-08-26 19:46:38 【问题描述】:我有一份教育机构文件,如下所示:
name: ..., addresses: [state: ..., locs: [], ...], courses: [...]
locs 是我的地理空间点所在的位置。
要执行$near
命令,我需要$unwind
地址,因为我可以在很多方面拥有一个教育机构。
我目前的方法是这样的:
public BasicDBList findByCoordinates(double latitude, double longitude)
BasicDBObject cmdBody = new BasicDBObject("aggregate", "EducationalInstitution");
List<BasicDBObject> pipeline = new ArrayList<BasicDBObject>();
BasicDBObject projectParams = new BasicDBObject();
projectParams.put("name", 1);
projectParams.put("addresses.state", 1);
projectParams.put("addresses.locs", 1);
projectParams.put("courses", 1);
BasicDBObject geoParams = new BasicDBObject();
geoParams.put("$near", new double[] latitude, longitude );
geoParams.put("$maxDistance", 50/111.12);
pipeline.add(new BasicDBObject("$project", projectParams));
pipeline.add(new BasicDBObject("$unwind", "$addresses"));
cmdBody.put("pipeline", pipeline);
cmdBody.put("$addresses.locs", geoParams);
return (BasicDBList) getDatastore().getDB().command(cmdBody).get("result");
我尝试了 morphia 的近方法
createQuery().field("addresses.locs").near(latitude, longitude, 50/111.12);
但是它返回所有我想要展开的地址,我只需要离某个点很近的地址
【问题讨论】:
【参考方案1】:我找到了解决方案。首先我尝试使用 $match 和 $near,但是没有成功。
然后我阅读了 $geoNear 聚合并尝试将 put 作为我管道的最后一个参数,但是,根据 MongoDB 页面:“您只能使用 $geoNear 作为管道的第一阶段。”
我对需要的 $unwind 存在疑问,但是,我找到了一个有助于我进行数组本地化的参数。
我的外壳代码:
db.EducationalInstitution.aggregate(
$geoNear: near: [-15.795758,-47.892312], maxDistance: 50/111.12, distanceField: "addresses.calculated", includeLocs: "addresses.locs", niqueDocs: true,
$project: "name": 1, "addresses.state": 1, "addresses.locs": 1
);
我的 Java 代码:
public BasicDBList findByCoordinates(double longitude, double latitude)
BasicDBObject cmdBody = new BasicDBObject("aggregate", "EducationalInstitution");
List<BasicDBObject> pipeline = new ArrayList<BasicDBObject>();
BasicDBObject geoNearParams = new BasicDBObject();
geoNearParams.put("near", new double[] longitude, latitude,);
geoNearParams.put("maxDistance", 50/111.12);
geoNearParams.put("distanceField", "addresses.calculated");
geoNearParams.put("includeLocs", "addresses.locs");
geoNearParams.put("niqueDocs", true);
BasicDBObject projectParams = new BasicDBObject();
projectParams.put("name", 1);
projectParams.put("addresses.state", 1);
projectParams.put("addresses.locs", 1);
projectParams.put("courses", 1);
pipeline.add(new BasicDBObject("$geoNear", geoNearParams));
pipeline.add(new BasicDBObject("$project", projectParams));
cmdBody.put("pipeline", pipeline);
if( !getDatastore().getDB().command(cmdBody).ok() )
throw new MongoException(getDatastore().getDB().command(cmdBody).getErrorMessage());
return (BasicDBList) getDatastore().getDB().command(cmdBody).get("result");
谢谢
【讨论】:
以上是关于$near $unwind MongoDB 地理空间的主要内容,如果未能解决你的问题,请参考以下文章
具有稀疏复合索引的 MongoDB $near 地理空间查询错误 13311
Mongodb $near 查询 120 万份文档耗时 6 秒