Длинный поиск MongoDB с индексацией 2D-сферы в приложении Java

У меня есть случай, когда мне нужно искать близлежащих продавцов для зарегистрированных пользователей. Широта текущего города пользователя, которая будет использоваться для сравнения с данными продавца, хранящимися в нашей базе данных, выглядит следующим образом:

{ "merchant_id" : "W234FDHDF##234", "location" : { "loc" : {"широта" : -58.4,"lng" : 30.8},"город" : "Купертино" , "display_address": ["20956 W Homestead Rd" , "Cupertino, CA 95015"] , "postal_code" : "95015" , "country_code" : "US" , "address" : ["20956 W Homestead Rd"] , "код_состояния": "CA"} }

Я новичок в MongoDB и не очень разбираюсь в этом. Я использую API mongodb для нашего Java-приложения. Может ли кто-нибудь дать рекомендации, как реализовать это на Java?


person Deblina Das    schedule 12.08.2013    source источник


Ответы (1)


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);
person Derick    schedule 12.08.2013