我有一份这份文件:
[_id] => MongoId Object (
[$id] => 542e6f6f10f0ed75138b4567
)
[description] => Lorem...
[lat] => 37.5184124
[lng] => 15.015836000000036
[name] => My company
[phone] => +4977665556
[photos] => Array (
[0] => Array (
[_id] => MongoId Object (
[$id] => 542e6f7a10f0ed73138b4567
)
[image] => 06c2aeb0a8fbc03b7c77732166114a23.jpg
)
[1] => Array (
[_id] => MongoId Object (
[$id] => 542e6f7c10f0ed77138b4568
)
[image] => a7a428c48291137bade2fd81c842c5ab.jpg
)
)
现在我想只使用Doctrine ODM获得数组photos
。
我尝试了这个查询,但没有工作:
$this->createQueryBuilder('Company')
->select('photos')
->field('ID')->equals($id)
->getQuery()
->getSingleResult();
此查询不仅会返回photos
所有文档。
为什么吗
答案 0 :(得分:2)
使用Builder::select()
投影特定字段并不意味着查询将单独返回该字段。公司的查询构建器将始终返回Company对象。在您的情况下,getSingleResult()
使查询返回单个对象而不是Company对象的可迭代游标。 select()
投影意味着MongoDB查询只会返回_id
和photos
字段,然后这些字段会被水合成公司对象。
因此,您会发现Company::getName()
可能会返回null
,而Company::getPhotos()
可能会返回PersistentCollection
个Photo对象。我从你的例子中不清楚这些是否被引用或只是带有_id
字段的嵌入式文档。
默认情况下,ODM会为查询结果提供水合作用。当您使用投影来排除字段时,这可能会出现问题,因为对非水合字段的任何进一步分配可能会被选为更改并持久保存回数据库。如果您更喜欢获取原始数据,可以使用通过Builder::hydrate()
禁用水合作用,这需要一个布尔值。
在旁注中,我建议您在'id'
查询中使用'_id'
或'ID'
代替field()
。我不确定ODM在查找映射字段时是否进行不区分大小写的字符串比较 - 除非您的PHP属性为$ID
,在这种情况下您可以忽略此建议。