Не удается получить базовые геопространственные запросы с ODM - PullRequest
0 голосов
/ 25 мая 2018

Я на 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);
  }
}
...