gpt4 book ai didi

php - MongoDB 按引用字段过滤 (ORM)

转载 作者:可可西里 更新时间:2023-11-01 10:43:20 25 4
gpt4 key购买 nike

假设我有文档 city和文件 country .

city ' 引用 country通过 country: ObjectId("xxxx")

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

这可能吗?我不这么认为,但是否可以将 MongoDB ORM 用于 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;

}

最佳答案

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

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

如果出于某种原因,您想通过某个国家/地区的非唯一值(例如大陆、名称上的子字符串匹配)来查找城市,这仍然可以在两个查询中完成。第一个将再次为符合条件的任何国家/地区找到 ObjectId。第二个查询将使用 $in具有 ObjectId 数组的运算符:

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

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

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

关于php - MongoDB 按引用字段过滤 (ORM),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28226368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com