123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- Title: Embedded Documents
- Author: Dariusz Górecki <darek.krk@gmail.com>
- ---
- # Basic informations about embedded documents
- ## Must know: {#mustknow}
- - For performance reasons all models of embedded documents should extend from `EMongoEmbeddedDocument` class
- - But the above is not a must, things will still work if you define as embedded child classes of regular `EMongoDocument`
- - You can define as many embedded documents as you wish
- - Every embedded document **can contain** embedded documents!
- - The only limit for this mechanism is that serialized version (in raw array format) of whole document, must not extend the 4 MB size
- - For documents bigger than 4 MB see the [GridFS Section][advanced.gridfs]
- - Main difference between `EMongoDocument` and EMongoEmbeddedDocument` is that:
- - EMongoDocument extends from EMongoEmbeddedDocument
- - EMongoDocument is equipped with all methods needed to save its contents into a MongoDB collection
- - You cannot call ie `save()` method on a EMongoEmbeddedDocument
- ## Defining embedded documents within document {#defining}
- **This applies to EMongoDocument and EMongoEmbeddedDocument**
- Just define the `embeddedDocuments()` method in yours model class, it should return array of
- simple key => value pairs.
- - Array values are class names that will be used to instantinate embedded documents
- - Array keys are treated as property names of given embedded document class
- example:
- ~~~
- [php]
- // ...
- // within model class
- public function embeddedDocuments()
- {
- return array(
- 'address' => 'UserAddress',
- 'some_other_field_name' => 'AnyEMongoEmbeddedDocumentChildClass',
- );
- }
- // this will give you access to propeties of model:
- $model->address->embeddedExampleField;
- $model->some_other_field_name->embeddedExampleField;
- ~~~
- ## How to force save of embedded document into collection {#forcesave}
- - First we need to get the mongo collection object ie:
- - `$collection = SomeModelClass::model()->getCollection();`
- - `$collection = SomeModelClass::model()->getDb()->collectionName;`
- - `$collection = Yii::app()->getComponent('mongodb')->getConnection()->collectionName;`
- - When we have our collection model, we now can force save of embedded document as a regular root document:
- - `$collection->save($ourEmbeddedModel->toArray());`
|