$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 秒

MongoDB 操作符 $unwind 展开数组(agregation)

通过 zip 进行 MongoDB 地理空间搜索

MongoDB 对地理空间查询的计数不准确

在 $or 中运行多个 geo $near 查询