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;

任何人都可以帮助我,有一些想法,我尝试了一切,似乎没有任何工作

4

2 回答 2

6

我只是通过使用引用对象的 ID 而不是引用对象本身作为我的搜索词来解决这个问题。

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

编辑:这并没有引发异常,但它实际上也没有返回任何东西。我尝试按照一些地方的建议使用 new MongoId($id) (Doctrine MongoDB find by id),但这也不起作用。最后,我在按引用搜索的完整查询构建器中找到了一些东西(注意:这使用对象而不是对象的 ID)。

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

我觉得这应该更简单地完成(就像你最初所做的那样),但这个修复对我有用。

于 2014-09-12T02:26:39.530 回答
5

可能是您试图保留对象私有属性。

如果不是这种情况,调试的好方法是关闭零长度密钥检查,以便您可以通过检查写入 mongo 的内容来实际调试。

零长度键是​​不允许的,你用双引号的 $ 吗?

代码:1

您试图将“”保存为密钥。您通常不应该这样做。"" 可能会弄乱子对象的访问,并由 MongoDB 内部使用。但是,如果您真的需要,可以在 php.ini 文件中将 mongo.allow_empty_keys 设置为 true 以覆盖此健全性检查。如果您覆盖它,强烈建议您将错误检查设置为严格以避免字符串插值错误。

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

于 2015-05-12T09:39:58.310 回答