为什么我不能在MongoDB文档中存储关联数组?

时间:2019-05-20 22:28:07

标签: php arrays mongodb symfony doctrine

我想将日期以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);

我想精确地说,我在Symfony 4上使用针对MongoDB的Doctrine ODM。

这是我的问题:

1)如何存储具有关联键的数组?

2) MongoDB文档中的密钥是否“固定”?我的意思是,我确定键0始终与$ day关联,而键1与$ month关联吗?

2 个答案:

答案 0 :(得分:1)

您可以使用Doctrine ODM提供的EmbeddedDocument功能。

首先,您需要在AppBundle \ Document \ DateExample.php中创建EmbeddedDocument DateExample:

<?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);

// ...

答案 1 :(得分:1)

您需要使用hash type

  

hash:与MongoDB对象的关联数组

     

collection:数字索引数组到MongoDB数组

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