Встроить много строк в документ MongoDB?

Мне нужно иметь простой массив/набор строк в моем документе, но я не могу найти способ добиться этого с помощью 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 в формате JSON так же прост:

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

Мне нужна помощь в том, как получить аннотацию @MongoDB\EmbedMany, чтобы позволить мне добавлять в коллекцию только строки, которые затем будут выглядеть как приведенный выше JSON при сохранении в БД.

Я надеюсь, что кто-то может помочь, так как я действительно застрял с этим сейчас. Кажется, это должно быть так просто!


person Rob Holmes    schedule 24.11.2012    source источник
comment
Если последним должен быть JSON, тогда массив будет [ ] не {} - последний представляет собой один встроенный документ, для которого это недопустимый синтаксис.   -  person Asya Kamsky    schedule 24.11.2012
comment
Спасибо, что заметили эту Асю. Я отредактировал вопрос сейчас.   -  person Rob Holmes    schedule 24.11.2012
comment
Я думаю, вам нужно определить новую модель для проверки данных вложенных документов, а затем прикрепить эту модель как embedMany к ее родительской модели.   -  person Sammaye    schedule 25.11.2012


Ответы (2)


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

person Sgoettschkes    schedule 25.11.2012
comment
Да, это так... Большое спасибо! Я пытался решить это целую вечность. Я заглянул в папку с аннотациями, но полностью пропустил тип Hash (думаю, я проглядел его из-за имени). - person Rob Holmes; 26.11.2012
comment
Название сбивает с толку. У меня есть открытый PR на документы, пытающиеся решить эту проблему. - person Sgoettschkes; 26.11.2012
comment
Именование глупо и даже не документировано должным образом, насколько я могу судить. - person Vahid Amiri; 01.08.2017

также 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;
}
person M.Z.    schedule 14.11.2017