2013-06-10 4 views
6

내가, symfony2 및 MongoDB를 사용하고 있지만 새 문서를 작성하고, 갑자기,이 오류가 나타납니다 :

"MongoException : 길이 제로의 키가 허용되지 않습니다, 당신을했다 큰 따옴표로 $를 사용합니까? "

$dm = $this->get('doctrine.odm.mongodb.document_manager'); 
$_repo = $dm->getRepository('CantaoCustomerBundle:CustomerTags'); 
$_repo->findOneByCustomer($customer); 

이 확인 년대 $customer, 저장소가 비어 있습니다, 내 문서 클래스는 다음과 같이이다 :

이 가
/** 
    * @MongoDB\ID 
    **/ 
    private $id; 

    /** 
    * @MongoDB\ReferenceOne(targetDocument="Tapronto\Mats\ProductBundle\Document\Tag", cascade={"persist"}) 
    **/ 
    private $tag; 

    /** 
    * @MongoDB\ReferenceOne(targetDocument="Tapronto\Mats\CustomerBundle\Document\Customer", cascade={"persist"}) 
    **/ 
    private $customer; 

    /** 
    * @MongoDB\Float 
    **/ 
    private $points; 

    /** 
    * @MongoDB\Int 
    **/ 
    private $viewed; 

    /** 
    * @MongoDB\Int 
    **/ 
    private $brought; 

    /** 
    * @MongoDB\Int 
    **/ 
    private $favorited; 

    /** 
    * @MongoDB\Date 
    * @Gedmo\Timestampable(on="create") 
    **/ 
    private $createdAt; 

    /** 
    * @MongoDB\Date 
    * @Gedmo\Timestampable(on="update") 
    **/ 
    private $updatedAt; 

이 사람이 나를 도울 수 , 몇 가지 아이디어를 가지고, 내가 노력 모든 것을 아무것도가 보인다 work

+0

는 임베디드 문서인가? –

+0

아니에요. 이론적으로이 문서는 고객과 태그 사이의 관계를 만들지 만 임베디드되지는 않습니다. –

답변

5

개체 개인 특성을 유지하려고 할 수 있습니다.

그렇지 않은 경우 디버깅하는 좋은 방법은 길이가 0 인 키 검사를 종료하여 실제로 mongo에 기록되는 내용을 확인하여 디버그 할 수 있도록하는 것입니다.

길이가 0 인 키는 허용되지 않으므로 큰 따옴표로 $를 사용 했습니까?

코드 : 1

""을 키로 저장하려고했습니다. 당신은 일반적으로 이것을해서는 안됩니다. ""하위 객체 접근을 망칠 수 있으며 MongoDB가 내부적으로 사용합니다. 그러나 정말로 원한다면 php.ini 파일에서 mongo.allow_empty_keys를 true로 설정하여이 온 전성 체크를 무시할 수 있습니다. 이것을 오버라이드 (override)하는 경우, 스트링 보간 에러를 피하기 (위해) 때문에, 에러 체크를 strict로 설정하는 것을 강하게 추천합니다.

http://php.net/manual/en/mongo.configuration.php#ini.mongo.allow-empty-keys

5

방금 ​​참조 개체 대신 내 참조 개체 ID를 사용하여이 문제를 해결했습니다.

$_repo->findOneByCustomer($customer->getId()); 

편집 : 예외를 던지는 것이 아니라, 실제로 중 아무 것도 반환하지 않습니다 . 나는 몇 군데 (Doctrine MongoDB find by id)를 제안했지만 새로운 MongoId ($ id)를 사용해 보았지만 그 역시 효과가 없었다. 마지막으로 참조로 검색하는 항목을 전체 쿼리 작성기에서 찾았습니다 (참고 : 개체 ID 대신 개체를 사용함).

$dm->createQueryBuilder()->find('CantaoCustomerBundle:CustomerTags') 
         ->field('customer')->references($customer) 
         ->getQuery()->execute(); 

나는이 작업이 더 간단하게 수행되어야한다고 생각합니다.하지만이 수정은 저에게 효과적입니다.