Почему я не могу хранить ассоциативные массивы в документе MongoDB? - PullRequest
1 голос
/ 21 мая 2019

Я хотел бы сохранить дату в формате JJ / MM / YYYY в ассоциативном массиве, подобном этому:

'day' => $day,
'month' => $month,
'year' => $year

Я сделал это довольно легко, но как только я пытаюсь сохранить документ в коллекции, дата сохраняется в документе следующим образом:

0 => $day
1 => $month
2 => $year

Я сделал PHP-отладку объекта непосредственно перед «сбросом», и он показал ключи, связанные со значениями, но однажды в коллекции он был сброшен с помощью цифровых клавиш.

Моя сущность выглядит так:

/**
 * @MongoDB\Field(type="collection")
 */
private $date;

public function getDate()
{
    return $this->date;
}

public function setDate($date)
{
    $this->date = $date;

    return $this;
}

И часть контроллера:

$date = $movie->getDate();
$keys = array('day', 'month', 'year');
$values = explode('/', $date);
$dateArray = array_combine($keys, $values);
$movie->setDate($dateArray);

Я хотел бы уточнить, что я использую Doctrine ODM для MongoDB в Symfony 4.

Итак, вот мои вопросы:

1) Как сохранить массив со связанными ключами?

2) Являются ли ключи в документе MongoDB «фиксированными»? Я имею в виду, уверен ли я, что ключ 0 всегда будет связан с $ day, а ключ 1 с $ month?

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Вам необходимо использовать hash тип :

hash: ассоциативный массив для объекта MongoDB

collection: численно проиндексированный массив в массив MongoDB

/**
 * @MongoDB\Field(type="hash")
 */
private $date;
1 голос
/ 21 мая 2019

Вы можете использовать функцию EmbeddedDocument, предоставляемую Doctrine ODM.

Сначала вам необходимо создать EmbeddedDocument DateExample в AppBundle \ Document \ DateExample.php:

<?php

namespace AppBundle\Document;

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

/**
 * @MongoDB\EmbeddedDocument()
 */
class DateExample
{
    /**
     * @MongoDB\Field(type="int")
     */
    protected $day;

    /**
     * @MongoDB\Field(type="int")
     */
    protected $month;

    /**
     * @MongoDB\Field(type="int")
     */
    protected $year;

    // getter and setter
}

Затем вы можете использоватьDateExample в вашем примере документа.Таким образом, файл Example.php будет похож на это:

<?php

namespace AppBundle\Document;

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

/**
* @MongoDB\Document(repositoryClass="AppBundle\Repository\ExampleRepository")
*/
class Example
{

    /** @MongoDB\EmbedOne(targetDocument="DateExample") */
    private $date;

    // ...
}

И часть контроллера:

$date_example = new DateExample();
$date_example->setDay(21);
$date_example->setMonth(05);
$date_example->setYear(2019);

$example = new Example();
$example->setDate($date_example);

// ...
...