MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Използване на свойство на обект като аргумент $maxDistance в заявка за геолокация на mongodb

Не можете да направите това по този начин — по принцип не можете да базирате нищо във вашите MongoDB заявки на стойности в колекциите.

От MongoDB 2.4 обаче поддържаме нов индекс, наречен 2dsphere което ви позволява да съхранявате не само точки в базата данни, но и полигони. Бихте съхранили тази информация в документ като:

db.so.ensureIndex( { loc: '2dsphere' } );
db.so.insert( {
    name: "Firestation 1",
    loc: {
        type: "Polygon",
        coordinates: [ [ [ 0, 0 ], [ 0, 1 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ] ] ]
    }
} );

След това можете да използвате заявка за „пресичане“, за да разберете дали дадена точка е покрита от всеки от полигоните:

db.so.find( {
    'loc' : {  
        $geoIntersects: { 
            $geometry: { type: 'Point', coordinates: [ 0, 0 ] } 
        } 
    }
} );

Което след това връща:

{ 
    "_id" : ObjectId("51f24d566775068ab0b786f0"), 
    "name" : "Firestation 1", 
    "loc" : { 
        "type" : "Polygon", 
        "coordinates" : [  [  [  0,  0 ],  [  0,  1 ],  [  1,  1 ],  [  1,  0 ],  [  0,  0 ] ] ] 
    } 
}

Тук намира пожарната, защото 0, 0 е в средата на полигона. Сега номерът, разбира се, е да се изчислят многоъгълните точки, които образуват кръг, който е на "радиус" (да речем 10 км) от централната точка. Няма да можете да получите истински кръг, но шестоъгълник или осмоъгълник трябва да е достатъчно добър. Математиката за това не е изключително проста, но http:// www.movable-type.co.uk/scripts/latlong.html#destPoint има пример в JavaScript. Просто завъртете посоката си в 8 стъпки от 0 до 2PI, за да изчислите точките по обиколката на кръга и ги поставете в координатите. Не забравяйте да ги вградите в двойно вложен масив и да направите първия и последния еднакви:

{
    name: "Firestation 1",
    loc: {
        type: "Polygon",
        coordinates: [ [
            [ point1-lon, point1-lat ], 
            [ point2-lon, point2-lat ], 
            [ point3-lon, point3-lat ], 
            ...
            [ point1-lon, point1-lat ], 
        ] ]
    }
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Ефективно страниране на агрегацията на MongoDB?

  2. Агрегирайте отделни стойности в MongoDB

  3. Mongodb:кога да се обадя на secureIndex?

  4. Управление на продължителни операции в MongoDB

  5. MongoDB:Изтегляне на множество произволни документи от колекция