gpt4 book ai didi

php - 使用 Doctrine 的 MongoDB ODM - 如何通过嵌入文档的字段查找文档?

转载 作者:IT老高 更新时间:2023-10-28 13:35:36 25 4
gpt4 key购买 nike

我有以下文件:

  • 用户文档。
  • 嵌入文档,包含对(参见下一个文档)的引用
  • 网站文档

每个用户都有一个嵌入文档数组,每个文档代表他关注的一个项目 - 一个网站,一个推特帐户 - 可以选择标记他感兴趣的特定类别。每个嵌入文档都有对第三个文档的引用 - Site 文档(或 Twitter 文档等)。

问题是 - 使用 MongoDB ODM,如何使用该站点的 id 获取选择关注给定站点的所有用户的文档?
(见下文(在文件之后)如何在 mongodb shell 中完成)

User.php

<?php
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;

/**
* @ODM\Document
*/

class User {
/**
* @ODM\Id
* @var string
*/
protected $id;

/**
* @ODM\EmbedMany(
* discriminatorMap={
* "site"="SiteFollow",
* "twitter"="TwitterFollow",
* }
* )
* @var ArrayCollection;
*/
protected $follows;
}

SiteFollow.php

<?php
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;

/**
* @ODM\EmbeddedDocument
*/

class SiteFollow {
/**
* @ODM\Collection
* @var array
*/
protected $interestingCategories;

/**
* @ODM\ReferenceOne(targetDocument="Site", simple=true)
* @var Site
*/
protected $siteItem;
}

Site.php

<?php
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;

/**
* @ODM\Document
*/

class Site {
/**
* @ODM\Id
* @var string
*/
protected $id;

/**
* @ODM\String
* @var string
*/
protected $name;

/**
* @ODM\String
* @var string
*/
protected $url;
}

mongo shell 中的用户文档示例:

db.User.findOne()
{
"_id": ObjectId("123"),
"follows": [
{
"interestingCategories": [
"PHP"
]
"siteItem" : ObjectId("OBJECT_ID_OF_SITE_DOCUMENT"),
"_doctrine_class_name" : "site"
}
]
}

用于获取所有关注特定站点的用户的 Mongo shell 命令:

db.User.find({"follows.siteItem": ObjectId("OBJECT_ID_OF_SITE_DOCUMENT")})

最佳答案

我发现 answer provided by Madarco有时不能正常工作。如果您正在查询嵌入文档中引用字段的 $id 字段,您可能需要将 MongoId 对象传递给 equals() 方法.所以在这种情况下,它将是:

$repo = $odm->getRepository('User');
$repo->createQueryBuilder()
->field('follows.siteItem.$id')
->equals(new \MongoId($siteId))
->getQuery()
->execute();

关于php - 使用 Doctrine 的 MongoDB ODM - 如何通过嵌入文档的字段查找文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15247938/

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