2015-08-20 5 views
0

У меня возникла проблема получить значение расстояния mongodb в моем документе, когда я выполняю геоинформационные запросы.Doctrine ODM geoNear Расстояние не правильно отображено (всегда null)

У меня есть 3 документа: Место проведения, которое вставляет местоположение, которое вставляет координаты.

Вот "свет" версия моей модели

Место проведения:

/** 
* Venue 
* 
* @ODM\Document(repositoryClass="CLabs\VenueBundle\Document\VenueRepository") 
*/ 
class Venue 
{ 
    /** 
    * @var integer 
    * 
    * @ODM\Id(strategy="auto") 
    */ 
    protected $id; 

    /** 
    * @var float 
    * 
    * @ODM\Distance 
    * @ODM\NotSaved 
    */ 
    public $distance; 

    /** 
    * @var \Location 
    * 
    * @ODM\EmbedOne(
    *  targetDocument="CLabs\LocationBundle\Document\Location" 
    *) 
    */ 
    protected $location; 

    /** 
    * Get id 
    * 
    * @return id $id 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set distance 
    * 
    * @param float $distance 
    * @return self 
    */ 
    public function setDistance($distance) 
    { 
     $this->distance = $distance; 
     return $this; 
    } 

    /** 
    * Get distance 
    * 
    * @return float $distance 
    */ 
    public function getDistance() 
    { 
     return $this->distance; 
    } 

    /** 
    * Set location 
    * 
    * @param CLabs\LocationBundle\Document\Location $location 
    * @return self 
    */ 
    public function setLocation(\CLabs\LocationBundle\Document\Location $location) 
    { 
     $this->location = $location; 
     return $this; 
    } 

    /** 
    * Get location 
    * 
    * @return CLabs\LocationBundle\Document\Location $location 
    */ 
    public function getLocation() 
    { 
     return $this->location; 
    } 
} 

Расположение:

/** 
* Location 
* 
* @ODM\EmbeddedDocument 
* @ODM\Index(keys={"coordinates"="2d"}) 
*/ 
class Location 
{ 
    /** 
    * @var \Coordinates 
    * 
    * @ODM\EmbedOne(
    *  targetDocument="CLabs\LocationBundle\Document\Coordinates" 
    *) 
    */ 
    protected $coordinates; 

    /** 
    * Set coordinates 
    * 
    * @param CLabs\LocationBundle\Document\Coordinates $coordinates 
    * @return self 
    */ 
    public function setCoordinates(\CLabs\LocationBundle\Document\Coordinates $coordinates) 
    { 
     $this->coordinates = $coordinates; 
     return $this; 
    } 

    /** 
    * Get coordinates 
    * 
    * @return CLabs\LocationBundle\Document\Coordinates $coordinates 
    */ 
    public function getCoordinates() 
    { 
     return $this->coordinates; 
    } 
} 

Координаты:

/** 
* Coordinates 
* @ODM\EmbeddedDocument 
*/ 
class Coordinates 
{ 
    /** 
    * @var string 
    * 
    * @ODM\Float 
    */ 
    protected $lng; 

    /** 
    * @var string 
    * 
    * @ODM\Float 
    */ 
    protected $lat; 

    /** 
    * Set lng 
    * 
    * @param float $lng 
    * @return self 
    */ 
    public function setLng($lng) 
    { 
     $this->lng = $lng; 
     return $this; 
    } 

    /** 
    * Get lng 
    * 
    * @return float $lng 
    */ 
    public function getLng() 
    { 
     return $this->lng; 
    } 

    /** 
    * Set lat 
    * 
    * @param float $lat 
    * @return self 
    */ 
    public function setLat($lat) 
    { 
     $this->lat = $lat; 
     return $this; 
    } 

    /** 
    * Get lat 
    * 
    * @return float $lat 
    */ 
    public function getLat() 
    { 
     return $this->lat; 
    } 
} 

Из этой модели, когда Я делаю ge oNear запрос на VenueRepository как это один:

$kmsMultiplier = 6378.137; 

return $this->createQueryBuilder() 
    ->geoNear((float)$lng, (float)$lat) 
    ->maxDistance($maxDistance/$kmsMultiplier) 
    ->spherical(true) 
    // Convert radians to kilometers 
    ->distanceMultiplier($kmsMultiplier) 
    ->getQuery() 
    ->execute(); 

извлечь свою коллекцию объектов, делая «$ result-> ToArray()» (или просто Еогеасп по результатам), то я хотел бы получить расстояние от моего объекта как это должно быть возможно, как описано в doctrine documentation.

Но когда я делаю $venue->getDistance(), он всегда возвращает null, даже если mongodb правильно рассчитал расстояния.

Вот пример результата этого запроса:

"elements": [ 
     { 
     "id": "559f7b728b8ff7c1127b23c8", 
     "location": { 
      "coordinates": { 
      "lng": 5.4190150243677, 
      "lat": 43.533426029669 
      } 
     } 
     }... 
    ], 
    "commandResult": { 
     "results": [ 
     { 
      "dis": 3.1465013027305, 
      "obj": { 
      "_id": { 
       "$id": "559f7b728b8ff7c1127b23c8" 
      }, 
      "location": { 
       "coordinates": { 
       "lng": 5.4190150243677, 
       "lat": 43.533426029669 
       } 
      } 
      } 
     }... 
     ], 
     "stats": { 
     "nscanned": 3, 
     "objectsLoaded": 3, 
     "avgDistance": 3.8863491981201, 
     "maxDistance": 4.3498686266835, 
     "time": 0 
     }, 
     "ok": 1 
    } 

Я попытался удалить мои прибудет/setDistance из Venue документа, перемещение $ расстояния декларации в Location документе, но ничего не работает, я не могу получить расстояние от $object->getDistance() до $object->distance.

Я мог бы обработать это свойство, сопоставляя себя, но было бы гораздо удобнее использовать метод Doctrine, ну, если он работает ... Я не могу понять, где моя ошибка, или если мой код виноваты.

Вот пример моего composer.json:

"symfony/symfony": "v2.6.4", 
"doctrine/mongodb": "v1.1.8", 
"doctrine/mongodb-odm": "v1.0.0-BETA13", 
"doctrine/mongodb-odm-bundle": "v3.0.0" 

У меня есть MongoDB 2.6.11 установлен на Debian VM (Linux wheezy64 3.2.0-4-amd64 # 1 SMP Debian 3.2.68- 1 + deb7u3 x86_64 GNU/Linux).

Считаете ли вы, что это проблема ODM Doctrine? Я единственный, кто имеет эту проблему?

Любая помощь оценили

ответ

0

После некоторого копания, я нашел решение сам.

Сначала я обновил некоторые связки:

  • учение/MongoDB => 1.2.0
  • учение/MongoDB-= ODM> 1.0.1

Но проблема все еще произошло.

На самом деле, похоже, что в моей модели произошел конфликт между аннотациями @NotSaved и @Distance. Ранее я добавлял аннотацию @NotSaved, потому что при выполнении запросов geoNear у меня были ошибки отображения в прежних версиях связок.

Эти проблемы должны были быть решены в последних версиях пучков, потому что после удаления аннотации @NotSaved из поля расстояния теперь я получаю значение расстояния в запросах geoNear, также Doctrine больше не пытается сохранить поле расстояния в db.

Смежные вопросы