【问题标题】:Doctrine MongoDb - ReferenceMany loading says Can't canonicalize queryDoctrine MongoDb - ReferenceMany 加载说 Can't canonicalize query
【发布时间】:2014-08-05 20:20:45
【问题描述】:

我按照本教程进行操作,一切正常:http://doctrine-mongodb-odm.readthedocs.org/en/latest/reference/bidirectional-references.html

但是我更改了引用的存储位置。在上面的示例中,帖子包含一个用户。但我改变了它,所以用户会得到一系列帖子。保存工作正常。

但如果我加载一个用户并说$user->getPosts() 我得到零结果。如果我查看 mongodb,则不会保存任何引用。所以我把User中的注解改成了/** @ODM\ReferenceMany(targetDocument="BlogPost", cascade="all") */(注意这里的cascade="all"已经改了)。现在引用已保存到 mongodb。

如果我再次加载用户并说$user->getPosts(),我会收到以下错误消息:

Uncaught exception 'MongoCursorException' with message 'localhost:27017: Can't canonicalize query: BadValue $in needs an array' in

我在loadReferenceManyCollectionOwningSide() 方法中调试到Doctrine\ODM\MongoDB\Persisters\DocumentPersister,其中in 运算符得到构建(第697 行)。不幸的是,正如您在屏幕截图中看到的那样,一切似乎都很好。 in 运算符有一个数组。所以我无法想象出了什么问题?

编辑/更多信息: 所以我发现了更多。如果我将两个实体的映射更改为ReferenceMany,我可以加载$post->getUsers(),但不能加载$user->getPosts()。请注意,User 实体是拥有方。但是为什么???

【问题讨论】:

    标签: php mongodb doctrine-orm doctrine


    【解决方案1】:

    这并不能完全回答您的问题,而是一些一般性的调试建议。

    根据我的经验,Doctrine 有点糟糕(我们不得不删除它,因为它引入了太多的缓慢和性能不佳的查询)。但是,要诊断此问题,我想您需要启用常规查询日志记录以查找发送的实际查询或使用 wireshark 或 mongosniff 来捕获它。

    鉴于错误,它可能是查询中的任何 $in 子句,而不仅仅是您找到的那个。此外,由于它完全由 Doctrine 管理,如果它没有在查询中生成另一个错误的 $in 子句,它可能会覆盖您稍后找到的 $in 子句。

    【讨论】:

      猜你喜欢
      • 2015-06-20
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      相关资源
      最近更新 更多