如何在MongoDB中使用$ in查询中的ObjectId?

时间:2016-08-02 11:30:18

标签: php mongodb symfony doctrine-orm doctrine

我在MongoDB中有以下查询

$this->createQueryBuilder()
            ->field('actor')->in($actorIdArray)
            ->getQuery()
            ->execute();

其中,field actor是带注释的对象引用

@MongoDB\ReferenceOne(targetDocument="User", simple=true)

表示它将存储对象Id而不是完整引用。

$ actorIdArray是一个带有

形式的id数组
["5706cb39821b166d3931f34f", "56015f7d4f8bd90b769e6e75"]

查询不返回任何内容,这是预期的,因为提交的actor包含对象id。

但是,如果我以这种方式构建数组

[new MongoId("5706cb39821b166d3931f34f"), new MongoId("56015f7d4f8bd90b769e6e75")]

它也不起作用,这对我来说非常令人惊讶。

日志显示查询已生成

{ "actor": {"$in":[{"$id":"5706cb39821b166d3931f34f"},{"$id":"56015f7d4f8bd90b769e6e75"}]}}

我认为它应该是这样的

{ "actor": {"$in":[ObjectId("5706cb39821b166d3931f34f"),ObjectId("56015f7d4f8bd90b769e6e75"]}}

不确定我做错了什么, 任何想法?

2 个答案:

答案 0 :(得分:0)

Doctrine希望你的数组是一个文档数组。

您无需查询即可加载document references

$dm = $this->get('doctrine.odm.mongodb.document_manager'):

$documents = array();
foreach($actorIdArray as $id){
    $documents[] = $dm->getReference('AppBundle:Actor',$id); // <- this is the key
}

$this->createQueryBuilder()
            ->field('actor')->in($documents)
            ->getQuery()
            ->execute();

答案 1 :(得分:0)

正如您在Doctrine\ODM\MongoDB\Query\Builder-> references方法的代码源中看到的那样:

public function references(object $document) : self
    {
        $this->requiresCurrentField();
        $mapping   = $this->getReferenceMapping();
        $reference = $this->dm->createReference($document, $mapping);
        $storeAs   = $mapping['storeAs'] ?? null;
        $keys      = [];

        switch ($storeAs) {
            case ClassMetadata::REFERENCE_STORE_AS_ID:
                $this->query[$mapping['name']] = $reference;

                return $this;
            .....

        return $this;
    }

您必须知道引用的构建方式。通常,这是通过$id完成的。

使用actor.$id作为字段名称:

$dm = $this->get('doctrine.odm.mongodb.document_manager'):

$documents = array();
foreach($actorIdArray as $id){
    $documents[] = new MongoDB\BSON\ObjectId($id);
}

$this->createQueryBuilder()
            ->field('actor.$id')->in($documents)
            ->getQuery()
            ->execute();