Я на Symfony и мне нужен список документов, основанный на некоторой широте и долготе.
Вот мои классы:
<?php
// src/GameBundle/Document/Store.php
namespace GameBundle\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
/**
* @MongoDB\Document(repositoryClass="GameBundle\Repository\StoreRepository")
* @MongoDB\Index(keys={"coordinates"="2d"})
*/
class Store
{
/**
* @MongoDB\Id(strategy="AUTO")
*/
protected $id;
/**
* @MongoDB\ReferenceOne(targetDocument="GameBundle\Document\Company")
*/
protected $company;
/**
* @MongoDB\Field(type="string")
*/
protected $name;
/**
* @MongoDB\EmbedOne(targetDocument="GameBundle\Document\Coordinates")
*/
protected $coordinates;
/**
* @MongoDB\Field(type="string")
*/
protected $phone;
/**
* @MongoDB\Field(type="string")
*/
protected $email;
/**
* @MongoDB\Field(type="string")
*/
protected $logo;
/**
* @MongoDB\Field(type="string")
*/
protected $description;
и мой класс координат
<?php
namespace GameBundle\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
/**
* @MongoDB\EmbeddedDocument
*/
class Coordinates
{
public function __construct($long, $lat) {
$this->setX($long);
$this->setY($lat);
}
/**
* @MongoDB\Field(type="float")
*/
protected $x;
/**
* @MongoDB\Field(type="float")
*/
protected $y;
и наконец мой репозиторий
<?php
namespace GameBundle\Repository;
use GameBundle\Document\Store;
use Doctrine\ODM\MongoDB\DocumentRepository;
/**
* Game Repository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class StoreRepository extends DocumentRepository
{
public function findIfExistNear($company, $long, $lat) {
$qb = $this->createQueryBuilder()
->field('company')->references($company)
->field('coordinates')->near($long, $lat);
$query = $qb->getQuery();
return $query->execute()->toArray(false);
}
}
В моем контроллере
$store = $em->getRepository('GameBundle:Store')->findIfExistNear($company, $long, $lat);
$view = $this->view($store);
return $this->handleView($view);
А вот ответ, когда я вызываю маршрут с почтальоном
"сообщение ":" Геометрия требуется для гео-ближнего запроса ",
Может ли кто-нибудь мне помочь, я думаю, что я следую этому примеру: Пример , но я не могу заставить его работать,Спасибо.
EDIT
Попробовал с массивом и у меня такая же ошибка.Вот один из моих документов
{
"_id" : ObjectId("5b07ddbd5d83ea08080014b3"),
"company" : DBRef("Company", ObjectId("5b07ddbd5d83ea0808001477"), "cdn"),
"name" : "Restaurant2",
"coordinates" : [ 43.48237556880739, -1.5671825408935547 ],
"phone" : "0102030405",
"email" : "Restaurant2@gmail.com"
}
Вот результат db.Store.getIndexes ()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "cdn.Store"
},
{
"v" : 1,
"key" : {
"coordinates" : "2d"
},
"name" : "coordinates_2d",
"sparse" : false,
"ns" : "cdn.Store"
}
]
и вот запрос, который я нашел в журналах
MongoDB query: {
"find":true,
"query":{
"company.$id":{"$id":"5b07ddbd5d83ea0808001471"},
"coordinates":{"$near":["-0.3580964000000222","43.31650579999999"]}},
"fields":[],
"db":"cdn","collection":"Store"
}
Пробует эту команду в оболочке:> db.Store.find ({"company. $ Id": ObjectId ("5b07ddbd5d83ea0808001471"), "координаты": {$ near: [-105. 06055001328127, 49.28511456161271]}})
И я получаю результат, но не должен, потому что эти координаты находятся в Америке, а мой магазин во Франции ...
ЧАСТЬ РЕШЕНИЯ
use GameBundle\Document\Store;
use Doctrine\ODM\MongoDB\DocumentRepository;
/**
* Game Repository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class StoreRepository extends DocumentRepository
{
public function findIfExistNear($company, $long, $lat) {
$qb = $this->createQueryBuilder()
->field('company')->references($company)
--- ->field('coordinates')->near($long, $lat);
+++ ->field('coordinates')->near((float) $long,(float) $lat);
$query = $qb->getQuery();
return $query->execute()->toArray(false);
}
}