Doctrine ODM Symfony3:查询数组字段含指定值的文档
在Doctrine MongoDB Repository中查询数组包含特定值的文档
刚好我之前也处理过类似的需求,用Doctrine MongoDB ODM来查询数组字段包含特定值的文档其实挺简单的,结合你的集合结构,给你两种常用的实现方案:
方案一:直接使用findBy快捷查询
如果你只是做简单的匹配,直接调用Repository的findBy方法就能搞定。假设你已经定义了对应的实体类(比如MyDocument),并且注入了它的Repository,直接传入字段和目标值即可:
// 在控制器或服务中注入MyDocumentRepository实例 $targetGroupId = 'id2'; $matchingDocuments = $myDocumentRepository->findBy(['groups' => $targetGroupId]);
Doctrine MongoDB ODM会自动把这个条件转换成MongoDB原生的数组包含查询,底层对应MongoDB的db.collection.find({ groups: "id2" }),刚好能匹配所有groups数组里包含id2的文档。
方案二:用QueryBuilder实现自定义查询
如果之后需要扩展查询条件(比如加上其他过滤、排序),用QueryBuilder会更灵活。你可以在自定义的Repository类里写一个专属方法:
首先是实体类的定义(参考你的集合结构):
<?php namespace App\Document; use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB; /** * @MongoDB\Document(repositoryClass="App\Repository\MyDocumentRepository") */ class MyDocument { /** * @MongoDB\Id */ private $id; /** * @MongoDB\Field(type="string") */ private $name; /** * @MongoDB\Field(type="collection") */ private $groups = []; // 这里省略getter、setter方法 }
然后在Repository类中添加自定义查询方法:
<?php namespace App\Repository; use App\Document\MyDocument; use Doctrine\Bundle\MongoDBBundle\Repository\ServiceDocumentRepository; class MyDocumentRepository extends ServiceDocumentRepository { public function findDocumentsByGroup(string $groupId): array { return $this->createQueryBuilder() ->field('groups')->equals($groupId) ->getQuery() ->execute() ->toArray(); } }
之后你就可以在业务代码里直接调用这个方法:
$matchingDocuments = $myDocumentRepository->findDocumentsByGroup('id2');
这里的field('groups')->equals($groupId)和方案一的底层逻辑一致,都是匹配数组中包含目标值的文档,后续你还能轻松添加sort()、limit()等额外操作。
内容的提问来源于stack exchange,提问作者mockingbid
相关产品推荐
相关产品推荐

