Вставить много строк в документ 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 DB как JSON так же прост:

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

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

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

2 ответа

Решение

Доктрина MongoDB ODM называет тип отображения для массивов "Hash", что немного сбивает с толку. Ваш класс будет выглядеть так:

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

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

    // ...

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

Сброс в MongoDB должен привести к хешу, хранящемуся в вашей коллекции, как вы описали в своем вопросе.

Для дальнейшего ознакомления взгляните на реализацию HashType

Также 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;
}
Другие вопросы по тегам