我正在使用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;
任何人都可以帮助我,有一些想法,我尝试了一切,似乎没有任何工作
答案 0 :(得分:6)
我只是通过使用引用的对象的ID而不是引用对象本身作为我的搜索词来修复它。
$_repo->findOneByCustomer($customer->getId());
编辑: 这不是抛出异常,但它实际上也没有返回任何东西。我尝试使用新的MongoId($ id),因为建议了几个地方(Doctrine MongoDB find by id),但这也没有用。最后,我在完整查询构建器中找到了一些按引用搜索的内容(注意:这使用了对象而不是对象的ID)。
$dm->createQueryBuilder()->find('CantaoCustomerBundle:CustomerTags')
->field('customer')->references($customer)
->getQuery()->execute();
我觉得这应该做得更简单(就像你原来的那样),但是这个修复对我有用。
答案 1 :(得分:5)
可能是您正在尝试保留对象私有属性。
如果情况并非如此,那么调试的好方法是关闭零长度密钥检查,以便通过检查它写入mongo的内容来实际调试。
不允许使用零长度密钥,您是否使用带双引号的$?
代码:1
您尝试将“”保存为关键字。你通常不应该这样做。 “”可能会破坏子对象访问,并在内部由MongoDB使用。但是,如果您真的想要,可以在php.ini文件中将mongo.allow_empty_keys设置为true以覆盖此完整性检查。如果覆盖它,强烈建议您将错误检查设置为strict以避免字符串插值错误。
http://php.net/manual/en/mongo.configuration.php#ini.mongo.allow-empty-keys