首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于参考场的MongoDB滤波器

基于参考场的MongoDB滤波器
EN

Stack Overflow用户
提问于 2015-01-29 23:05:05
回答 2查看 1.7K关注 0票数 1

假设我有document city和document country

citycountrycountry: ObjectId("xxxx")引用

我怎样才能按国家的领域找到城市,例如。db.Cities.find({"country.code":"US"}

有可能吗?我认为没有,但是是否可以使用MongoDB ORM呢?

我试过了

代码语言:javascript
复制
$qb = $this->database->createQueryBuilder(self::NAMESPACE_CITY);
$qb->field('country.code')->equals("US")`

我的City实体包含

代码语言:javascript
复制
/** @ODM\ReferenceOne(targetDocument="\Doctrine\Documents\Country", simple=true) */
protected $country;

文件示例:

代码语言:javascript
复制
<?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;

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-03 17:02:49

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

代码语言:javascript
复制
{ "country": ObjectId(...) }

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

代码语言:javascript
复制
{ "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期来跟踪这个特性请求。

票数 1
EN

Stack Overflow用户

发布于 2015-10-09 13:53:31

对于@MongoDB\ReferenceOne,必须使用Query的references()方法--类似于https://doctrine-mongodb-odm.readthedocs.org/en/latest/reference/query-builder-api.html

代码语言:javascript
复制
$country = $dm->getRepository('Country')->findOneByCode('US');

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

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

使用includesReferenceTo() a @MongoDB\ReferenceMany

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28226368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档