ReferenceOne с MongoDB - PullRequest
       4

ReferenceOne с MongoDB

2 голосов
/ 30 мая 2011

У меня проблема с Symfony2.0 BETA3 и MongoDB.Я хочу создать документ, где поле ссылается на другой класс, это может выглядеть так:

namespace test\TestBundle\Document;
use test\TestBundle\Document\Location;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;

/**
* @ODM\Document(collection="locationcache", repositoryClass="test\TestBundle\Document\LocationCacheRepository")
*/
class LocationCache
{
    // many more fields...

    /**
     * @var Location
     * @ODM\ReferenceOne(targetDocument="test\TestBundle\Document\Location")
     */
    protected $location;

     /**
         * @param Location
     */
    public function setLocation(Location $location)
    {
        $this->location = $location;
    }

    /**
     * @return Location
     */
    public function getLocation()
    {
        return $this->location;
    }
}

Но если я хочу найти местоположение по $ id, как это

class LocationCacheRepository extends DocumentRepository
{
    public function findByLocationID(MongoId $locationID)
    {
        return $this->createQueryBuilder()
            ->field('location.$id')->equals($locationID)
            ->sort('year', 'asc')
            ->sort('month', 'asc')
            ->getQuery()
            ->execute();
    }
}

Я получу эту ошибку

 No mapping found for field 'location' in class 'test\TestBundle\Document\LocationCache'.

ОБНОВЛЕНИЕ

Вот документ

Array
(
    [_id] => 4dd637e706936bbcc0ac012d
    [days] => Array
        (
            [1] => Array
                (
                    [money] => 9
                )

            [2] => Array
                (
                    [money] => 21
                )

            [3] => Array
                (
                    [money] => 38
                )

            [4] => Array
                (
                    [money] => 6
                )

            [18] => Array
                (
                    [money] => 6
                )

            [19] => Array
                (
                    [money] => 3
                )

            [31] => Array
                (
                    [money] => 11
                )

        )

    [location] => Array
        (
            [$ref] => location
            [$id] => 4dd554c91c911a6606000000
            [$db] => test
        )

    [money] => 94
    [month] => 1
    [year] => 2011
)    

Я не знаю, в чем проблема скласс.Может кто-нибудь помочь, пожалуйста?

Заранее спасибо!

  • Монти

1 Ответ

3 голосов
/ 30 мая 2011

Если вы хотите выполнить поиск по любому полю местоположения, вам нужно использовать 'embedOne' вместо 'referenceOne'. ReferenceOne не копировать поля местоположения в родительский документ, это просто данные, подобные этим (точно не помню):

{
 refId: '1',
 refColl: 'locations',
 refDb: 'location_database'
}

Но в целом, если вам нужен запрос только по идентификатору местоположения, вам просто нужно посмотреть, как ссылка на местоположение выглядит в mongodb, используя mongoshell или какой-либо другой инструмент.

Таким образом, ваш запрос будет выглядеть так:

   ->field('location.$refId')->equals($locationID)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...