MongoDB在Java应用程序中使用2D球体索引进行长搜索

时间:2013-08-12 07:46:10

标签: mongodb mongo-java

我有一个案例需要搜索登录用户所在位置的附近商家。 用户当前城市的lat长期用于与我们数据库中存储的商家数据进行比较,如下所示 -

{“merchant_id”:“W234FDHDF ## 234”,“location”:{“loc”:{“lat”: - 58.4,“lng”:30.8} ,“city”: “Cupertino”,“display_address”:[“20956 W Homestead Rd”,“Cupertino,CA 95015”],“postal_code”:“95015”,“country_code”:“US”,“address”:[“20956 W Homestead Rd “],”state_code“:”CA“}}

我是MongoDB的新手,对此并不太了解。我正在为我们的Java应用程序使用mongodb API。 有人可以提供如何在Java中实现它的指导吗?

1 个答案:

答案 0 :(得分:0)

MongoDB不关心loc中的字段名称。它总是首先使用经度,然后是纬度。你有错误的方法。相反,你想要这个:

db.col.ensureIndex( { location.loc: "2dsphere" } );

db.col.insert( { 
    "merchant_id" : "W234FDHDF##234", 
    "location" : { 
        "loc" : { type: "Point", coordinates: [ 30.8, -58.4 ] },
        "city" : "Cupertino",
    } 
} );

然后您可以使用$geoNear查询:

// location object
BasicDBObject myLoc = new BasicDBObject();
myLoc.append("type", "Point");
double[] loc = {-121.97679901123047,37.557369232177734}; 
// place comma in myLoc.append("coordinates", location);

myLoc.append("coordinates" , loc );

// command object
BasicDBObject myCmd = new BasicDBObject(); 
myCmd.append("geoNear", "col"); 
myCmd.append("near", myLoc); 
myCmd.append("spherical", true); 
myCmd.append("maxDistance", 50000); // in meters
System.out.println(myCmd); 
CommandResult myResults = db.command(myCmd);