You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:37:09