I need to have a simple array/collection of strings in my Document, but cannot work out a way to acheive this with Doctrine ODM.
This is an example class/document, with $tags
needing to be a simple array of strings:
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();
}
I've tried different things like @MongoDB\EmbedMany
or @MongoDB\EmbedMany(targetDocument="String")
I know there is no reason for the last one to work, but I was just trying anything I could think of.
The end result in the Mongo DB as JSON is as simple as this:
{
"_id": ObjectId("a0afa410caeea70de1000000"),
"name": "Example Name",
"tags": ["tag1", "example", "test tag"]
}
What I need help with is, how to have the @MongoDB\EmbedMany annotation to allow me to add only strings into the Collection, which will then look like the above JSON when persisted to the DB.
I hope someone can help, as I'm really stuck with this now. It feels like it should be so simple!
Doctrine MongoDB ODM calls the mapping type for arrays "Hash", which is a little confusing. Your class would look like this:
namespace Acme\ExampleBundle\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
/** @MongoDB\Document */
class MyDocument {
// ...
/** @MongoDB\Hash */
protected $tags = array();
}
Flushing to MongoDB should result in an hash stored inside your collection as you described in your question.
For further reference, have a look at the HashType implementation