MongoException: zero-length keys are not allowed, did you use $ with double quotes?

Victor Martins picture Victor Martins · Jun 10, 2013 · Viewed 8.8k times · Source

I'm using symfony2 and mongodb, until today, everything is OK, but I create a new document, and suddenly, appears this error :

"MongoException: zero-length keys are not allowed, did you use $ with double quotes?"

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

The $customer it's OK, the repository is empty, and my document class is like this :

    /**
     * @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;

Can anyone help me, have some idea, I tried everything and nothing seems to work

Answer

ntrrobng picture ntrrobng · Sep 12, 2014

I just fixed this by using the referenced object's ID instead of the reference object itself as my search term.

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

EDIT: That isn't throwing the exception but it isn't actually returning anything either. I tried using new MongoId($id) as was suggested a few places (Doctrine MongoDB find by id), but that didn't work either. Finally, I found something in the full query builder that searches by references (note: this uses the object instead of the object's ID).

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

I feel like this should be done more simply (like you did originally), but this fix is working for me.