【问题标题】:EmbedMany Strings in an MongoDB Document?在 MongoDB 文档中嵌入许多字符串?
【发布时间】:2012-11-24 13:20:59
【问题描述】:

我需要在我的文档中有一个简单的字符串数组/集合,但无法通过 Doctrine ODM 找到实现这一目标的方法。

这是一个示例类/文档,$tags 需要是一个简单的字符串数组:

namespace Acme\ExampleBundle\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;

/** @MongoDB\Document */
class MyDocument {

    /** @MongoDB\Id */
    protected $id;

    /** @MongoDB\String */
    protected $name;

    /** @MongoDB\EmbedMany */
    protected $tags = array();
}

我尝试了不同的方法,例如 @MongoDB\EmbedMany@MongoDB\EmbedMany(targetDocument="String") 我知道最后一个没有理由起作用,但我只是在尝试任何我能想到的方法。

在 Mongo DB 中作为 JSON 的最终结果就像这样简单:

{
    "_id": ObjectId("a0afa410caeea70de1000000"),
    "name": "Example Name",
    "tags": ["tag1", "example", "test tag"]
}

我需要帮助的是,如何使用 @MongoDB\EmbedMany 注释来允许我只将字符串添加到集合中,然后将其保存到数据库时看起来像上面的 JSON。

我希望有人可以提供帮助,因为我现在真的很困惑。感觉应该就是这么简单!

【问题讨论】:

  • 如果最后一个应该是 JSON,那么数组将是 [ ] 而不是 {} - 后者是单个嵌入式文档,这不是合法的语法。
  • 感谢您发现 Asya。我现在已经编辑了问题。
  • 我认为您必须为子文档的数据验证定义一个新模型,然后将该模型作为 embedMany 附加到其父模型中。

标签: php mongodb symfony doctrine-odm doctrine-mongodb


【解决方案1】:

Doctrine MongoDB ODM 将数组的映射类型称为“哈希”,这有点令人困惑。你的班级应该是这样的:

namespace Acme\ExampleBundle\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;

/** @MongoDB\Document */
class MyDocument {

    // ...

    /** @MongoDB\Hash */
    protected $tags = array();
}

如您在问题中描述的那样,刷新到 MongoDB 应该会在您的集合中存储一个哈希值。

如需进一步参考,请查看HashType implementation

【讨论】:

  • 是的,就是这样...非常感谢!多年来,我一直在努力解决这个问题。我查看了 annotations 文件夹,但完全错过了 Hash 类型(我想我因为名字而忽略了它)。
  • 这个名字很混乱。我在试图解决这个问题的文档上有一个公开的 PR。
  • 命名很愚蠢,据我所知,甚至没有正确记录。
【解决方案2】:

type="collection" 的工作方式也与哈希相同

 /**
 * @MongoDB\Field(type="collection")
 */

protected $possibleTags;

/**
 * Set tags
 *
 * @param collection $possibleTags
 * @return $this
 */
public function setPossibleTags($possibleTags)
{
    $this->possibleTags = $possibleTags;
    return $this;
}

/**
 * Get tags
 *
 * @return collection $tags
 */
public function getPossibleTags()
{
    return $this->possibleTags;
}

【讨论】:

    猜你喜欢
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    相关资源
    最近更新 更多