2013-08-26 37 views
1

我有一個教育Intitution文件看起來像這樣:

{ 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"); 
} 

我試圖接近方法從嗎啡

createQuery().field("addresses.locs").near(latitude, longitude, 50/111.12); 

但是它返回,我想unwinded,我只需要它是從附近的地址的所有地址點

回答

0

我找到了一個解決方案。首先,我嘗試使用$ match和$ near,但是沒有成功。

然後我讀了$ geoNear聚合,然後試着把它作爲我的管道的最後一個參數,但是,根據MongoDB頁面:「您只能使用$ geoNear作爲管道的第一階段。」

我對我需要的$放鬆表示懷疑,但是,我發現了一個幫助我進行數組本地化的參數。

我的shell代碼:

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"); 
} 

THX