假设我有document city和document country。
city对country的country: ObjectId("xxxx")引用
我怎样才能按国家的领域找到城市,例如。db.Cities.find({"country.code":"US"}
有可能吗?我认为没有,但是是否可以使用MongoDB ORM呢?
我试过了
$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;
}发布于 2015-02-03 17:02:49
在一个查询中按国家代码查询城市文档需要加入这两个集合,这是不支持的。您可以通过首先使用给定的代码查找国家,将其分解为两个查询,我认为这是一个唯一的字符串。该查询将生成国家的ObjectId,然后您可以使用它查询城市集合:
{ "country": ObjectId(...) }如果出于某种原因,您希望通过country上的一些非唯一值(例如,非洲大陆,名称上的子字符串匹配)来查找城市,则仍然可以在两个查询中完成。第一个国家将再次为任何符合标准的国家找到ObjectIds。然后,第二个查询将使用$in操作符和一个ObjectIds数组:
{ "country": { "$in": [ ObjectId(...), ObjectId(...), ... ]}}如果使用原则MongoDB ODM,查询生成器通过Expr.php中的references()和includesReferenceTo()方法(也是通过Builder.php公开)来支持这一点。references()和includesReferenceTo()可以分别用于匹配存在于ReferenceOne或ReferenceMany关系中的单个文档引用。它们还正确地处理简单(即ObjectId)和复杂(即DBRef)引用。
尽管如此,ODM查询生成器没有针对多个引用进行匹配的方法(请注意,上述两种方法都采用单个文档参数)。因为您使用的是简单的引用,所以使用in()应该很容易,正如我在第二段中提到的那样;但是,如果我们使用DBRefs (我们需要混合$elemMatch和$in,正如在这个答案中所讨论的那样),查询将更加复杂。我在ODM项目上打开了第1024期来跟踪这个特性请求。
发布于 2015-10-09 13:53:31
对于@MongoDB\ReferenceOne,必须使用Query的references()方法--类似于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();使用includesReferenceTo() a @MongoDB\ReferenceMany
https://stackoverflow.com/questions/28226368
复制相似问题