【问题标题】:$near $unwind mongodb geospatial$near $unwind MongoDB 地理空间
【发布时间】: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);

但是它返回所有我想要展开的地址,我只需要离某个点很近的地址

【问题讨论】:

    标签: mongodb geolocation geospatial mongodb-java


    【解决方案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");
    }
    

    谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 2014-02-18
      • 2015-06-07
      • 2012-12-27
      • 1970-01-01
      • 1970-01-01
      • 2019-09-23
      相关资源
      最近更新 更多