假设我有文档city
和文档country
。
city
'country
对country: 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;
}
答案 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