Storing array with Doctrine and MongoDB

2019-02-17 18:45发布

How can I store an array with Doctrine and Mongo DB?

I do not want reference document, only array.

Example:

Type[ 
     Type1,
     Type2,
     Type3
]

Do I need to create new Doctrine ODM data type?

3条回答
Summer. ? 凉城
2楼-- · 2019-02-17 19:19
...
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
...
class MyClass
{
    /**
     * @MongoDB\Hash
     */
    protected $tags = array();
}

Besides, you can check out BSPTagBundle if you want a form type that helps you with that type of variable.

查看更多
3楼-- · 2019-02-17 19:21

You can use mongo types hash or collection as your need.

Hash : Stores and retrieves the value as associative array.

Collection : Stores and retrieves the value as numeric indexed array.

For example:

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;
}

The data is stored such as :

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

"country_wise_total_count": {
     "NP": NumberInt(7),
     "US" : NumberInt(10)
  }
查看更多
Luminary・发光体
4楼-- · 2019-02-17 19:24

If you need to store values not mapped to a document class in an array, you can use the collection field mapping, which maps to a basic array in MongoDB. There is also a hash type, which similarly converts an associative array in PHP to an object in MongoDB without mapping anything within it.

If "Type" in your example is a mapped document class, then you'll want to use an EmbedMany relationship, which will store one or more mapped documents in an array within the parent document. Within MongoDB, this will be represented as an array of objects, which is similar to what you could do yourself with the collection field (storing an array of associative arrays); however, ODM will utilize the EmbedMany mapping to hydrate those objects back to document instances.

查看更多
登录 后发表回答