2012-10-17 13 views

Odpowiedz

13

Jeśli chcesz przechowywać wartości nie odwzorowane na klasę dokumentu w tablicy, możesz użyć mapowania pola collection, które mapuje do podstawowej tablicy w MongoDB. Istnieje również typ hash, który podobnie przekształca tablicę asocjacyjną w PHP na obiekt w MongoDB bez mapowania czegokolwiek wewnątrz niego.

Jeśli "Typ" w twoim przykładzie jest zmapowaną klasą dokumentu, będziesz chciał użyć relacji EmbedMany, która będzie przechowywać jeden lub więcej zmapowanych dokumentów w tablicy w dokumencie nadrzędnym. W MongoDB będzie to reprezentowane jako tablica obiektów, która jest podobna do tego, co można zrobić samemu z polem collection (przechowywanie tablicy tablic asocjacyjnych); jednak ODM użyje mapowania EmbedMany w celu uwodnienia tych obiektów z powrotem do dokumentów.

+0

pracował dla mnie, dzięki. Nie jest jasne, dlaczego nie podano tego w dokumentach http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/reference/basic-mapping.html#doctrine-mapping-types –

+0

Jaki rodzaj mapowanie należy użyć do aktualizacji tablicy, aby dodać kolejny klucz: element value? – Sekai

+0

@Sekai: Nie rozumiem pytania. Typ 'collection' uruchamia wartość PHP przez' array_values ​​() 'przed zapisaniem jej w polu MongoDB (w celu ponownego zindeksowania klawiszy numerycznie). Strategia 'hash' rzuca wartość PHP na obiekt (np. StdClass w PHP), aby upewnić się, że jest zapisany jako obiekt BSON. Żadna z par klucz/wartość w obrębie wartości kolekcji/hash nie jest odwzorowana (to właśnie odróżnia je od osadzonych dokumentów (EmbedOne i EmbedMany) – jmikola

4
... 
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB; 
... 
class MyClass 
{ 
    /** 
    * @MongoDB\Hash 
    */ 
    protected $tags = array(); 
} 

Poza tym, można sprawdzić BSPTagBundle jeśli chcesz rodzaj formularza, który pomaga z tego typu zmiennej.

5

Możesz użyć skrótu typu mongo lub kolekcji jako swoich potrzeb.

Hash: Przechowuje i pobiera wartość jako tablicę asocjacyjną.

Kolekcja: Przechowuje i pobiera wartość jako tablicę indeksowaną.

Na przykład:

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

Dane są przechowywane takie jak:

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

"country_wise_total_count": { 
    "NP": NumberInt(7), 
    "US" : NumberInt(10) 
    } 
Powiązane problemy