MongoDB过滤引用字段(ORM)

时间:2015-01-29 23:05:06

标签: php mongodb orm

假设我有文档city和文档country

city'countrycountry: ObjectId("xxxx")

的引用

如何按国家/地区查找城市,例如: db.Cities.find({"country.code":"US"}

有可能吗?我想不是,但可能有可能使用MongoDB ORM for PHP吗?

我试过

$qb = $this->database->createQueryBuilder(self::NAMESPACE_CITY);
$qb->field('country.code')->equals("US")`

我的City实体包含

/** @ODM\ReferenceOne(targetDocument="\Doctrine\Documents\Country", simple=true) */
protected $country;

文档示例:

<?php

namespace Doctrine\Documents;

use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
use Application\Doctrine\Documents\Document;

/** @ODM\Document(collection="Cities") */
class City extends Document {

    /** @ODM\Id */
    protected $_id;

    /** @ODM\ReferenceOne(targetDocument="\Doctrine\Documents\Country", simple=true) */
    protected $country;

}

2 个答案:

答案 0 :(得分:1)

在单个查询中按国家/地区代码查询城市文档需要加入两个集合,这是不受支持的。您可以通过首先找到具有给定代码的国家/地区将其分解为两个查询,我假设这是一个唯一的字符串。该查询将产生国家/地区的ObjectId,然后您可以使用它来查询城市集合:

{ "country": ObjectId(...) }

如果出于某种原因,您希望通过国家/地区的某些非唯一值(例如,大陆,名称上的子字符串匹配)查找城市,则仍可以在两个查询中完成此操作。第一个将再次为符合条件的国家找到ObjectIds。然后,第二个查询将使用$in运算符和ObjectIds数组:

{ "country": { "$in": [ ObjectId(...), ObjectId(...), ... ]}}

如果您使用的是Doctrine MongoDB ODM,则查询构建器会通过Expr.php中的references()includesReferenceTo()方法(也通过Builder.php公开)支持此方法。 references()includesReferenceTo()可分别用于匹配ReferenceOne或ReferenceMany关系中存在的单个文档引用。它们还正确处理简单(即只是ObjectId)和复杂(即DBRef)引用。

也就是说,ODM查询构建器没有具有匹配多个引用的方法(请注意,上述两种方法都采用单个文档参数)。由于您使用的是简单引用,因此我应该很容易使用in()执行此操作,正如我在第二段中所提到的那样;但是,如果我们使用DBRefs,查询会更复杂(我们需要混合$elemMatch$in,如this answer中所述。我在ODM项目上打开issue #1024来跟踪此功能请求。

答案 1 :(得分:0)

您必须使用查询构建器的 references() 方法来获取 @MongoDB \ ReferenceOne ,例如https://doctrine-mongodb-odm.readthedocs.org/en/latest/reference/query-builder-api.html

$country = $dm->getRepository('Country')->findOneByCode('US');

$queryBuilder = $dm->getRepository('City')->createQueryBuilder()
                   ->field('country')->references($country);

$citiesByCountry = $queryBuilder->getQuery()->execute();


PS :使用 includesReferenceTo() a @MongoDB \ ReferenceMany