Хранение массива с Doctrine и MongoDB

Как я могу хранить массив с Doctrine и Mongo DB?

Я не хочу ссылочный документ, только массив.

Пример:

Type[ 
     Type1,
     Type2,
     Type3
]

Нужно ли создавать новый тип данных Doctrine ODM?

Ответы на вопрос(3)

...
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
...
class MyClass
{
    /**
     * @MongoDB\Hash
     */
    protected $tags = array();
}

BSPTagBundle если вам нужен тип формы, который поможет вам с этим типом переменной.

Хэш: Сохраняет и получает значение в виде ассоциативного массива.

Коллекция: Сохраняет и получает значение в виде числового индексированного массива.

Например:

use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;

class Category
{
    /**
     * @MongoDB\Field(name="tags", type="collection")
     */
    private $tags;

    /**
     * @MongoDB\Field(name="country_wise_total_count", type="hash")
     */
    private $country_wise_total_count;
}

Данные хранятся такие как:

"tags": [
    "man",
    "boy",
    "male",
    "sandal",
    "cloth",
    "army boots",
    "boots",
    "sport shoes",
    "school",
    "casual",
    "office"
  ],

"country_wise_total_count": {
     "NP": NumberInt(7),
     "US" : NumberInt(10)
  }

не сопоставленные с классом документа, в массиве, вы можете использоватьcollection отображение поля, которое сопоставляется с базовым массивом в MongoDB. Также естьhash type, который аналогичным образом преобразует ассоциативный массив в PHP в объект в MongoDB без сопоставления чего-либо внутри него.

Если «Тип» в вашем примере является классом сопоставленного документа, тогда вы захотите использоватьEmbedMany отношения, которые будут хранить один или несколько сопоставленных документов в массиве в родительском документе. В MongoDB это будет представлено как массив объектов, который похож на то, что вы могли бы сделать самостоятельно сcollection поле (хранение массива ассоциативных массивов); однако ODM будет использовать отображение EmbedMany для гидратации этих объектов обратно в экземпляры документа.

 jmikola09 сент. 2014 г., 20:53
Если в вашей модели есть метод, который добавляет элемент в поле массива, которое отображается какcollectionПоведение должно быть тем, что вы ожидаете. ODM не касается изменений в значениях массива / объекта дляhash а такжеcollectionтак что это просто собирается$set новое значение в документе. Это контрастирует с отношениями ссылочного и встраиваемого множества, где имеется больше логики для обновления отдельных элементов массива / объекта.
 Sekai05 сент. 2014 г., 14:03
Какое отображение мы должны использовать для обновления массива, чтобы добавить еще один элемент key: value?
 jmikola06 сент. 2014 г., 06:05
@Sekai: я не понимаю вопроса.collection Тип запускает значение PHP черезarray_values() перед записью его в поле MongoDB (для переиндексации ключей численно).hash Стратегия преобразует значение PHP в объект (т. е. stdClass в PHP), чтобы обеспечить его сохранение в виде объекта BSON. Ни одна из пар ключ / значение в коллекционных / хэш-значениях не отображается (именно это отличает их от встроенных документов (EmbedOne и EmbedMany).
 Elvis Ciotti03 дек. 2012 г., 15:14
работал для меня, спасибо. Непонятно, почему это не указано в документацииdocs.doctrine-project.org/projects/doctrine-mongodb-odm/en/...
 Sekai06 сент. 2014 г., 12:31
Я имел в виду, если у вас есть массив вроде 0 => 'a', 1 => 'b', и я хочу добавить 'c', чтобы массив выглядел как 0 => 'a', 1 => 'b', 2 => 'c' В symfony2 я вручную добавляю функцию в свой класс документа, чтобы сделать это. Мне интересно, есть ли отображение, которое бы автоматически генерировало эту функцию

Ваш ответ на вопрос