2012-10-17 57 views
5

Làm cách nào để lưu trữ một mảng bằng Doctrine và Mongo DB?Lưu trữ mảng với Doctrine và MongoDB

Tôi không muốn tài liệu tham khảo, chỉ mảng.

Ví dụ:

Type[ 
    Type1, 
    Type2, 
    Type3 
] 

Tôi có cần phải tạo mới thuyết ODM kiểu dữ liệu?

Trả lời

13

Nếu bạn cần lưu trữ các giá trị không được ánh xạ tới một lớp tài liệu trong một mảng, bạn có thể sử dụng ánh xạ trường collection, ánh xạ tới một mảng cơ bản trong MongoDB. Cũng có kiểu hash, tương tự chuyển đổi một mảng kết hợp trong PHP thành một đối tượng trong MongoDB mà không cần ánh xạ bất kỳ thứ gì bên trong nó.

Nếu "Loại" trong ví dụ của bạn là lớp tài liệu được ánh xạ, thì bạn sẽ muốn sử dụng mối quan hệ EmbedMany, sẽ lưu trữ một hoặc nhiều tài liệu được ánh xạ trong một mảng trong tài liệu gốc. Trong MongoDB, điều này sẽ được biểu diễn như một mảng các đối tượng, tương tự như những gì bạn có thể làm cho mình với trường collection (lưu trữ một mảng các mảng kết hợp); tuy nhiên, ODM sẽ sử dụng ánh xạ EmbedMany để hydrat các đối tượng đó trở lại các cá thể tài liệu.

+0

làm việc cho tôi nhờ. Không rõ lý do tại sao nó không được chỉ định trong tài liệu http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/reference/basic-mapping.html#doctrine-mapping-types –

+0

Loại chúng ta nên sử dụng ánh xạ để cập nhật mảng để thêm một yếu tố khóa: giá trị khác? – Sekai

+0

@Sekai: Tôi không hiểu câu hỏi. Kiểu 'collection' chạy giá trị PHP thông qua' array_values ​​() 'trước khi ghi nó vào trường MongoDB (để reindex các phím số). Chiến lược 'băm' đưa giá trị PHP vào một đối tượng (ví dụ: stdClass trong PHP) để đảm bảo nó được lưu dưới dạng đối tượng BSON. Không có cặp khóa/giá trị nào trong các giá trị thu thập/băm được ánh xạ (đó là điều phân biệt chúng với các tài liệu được nhúng (EmbedOne và EmbedMany) – jmikola

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

Ngoài ra, bạn có thể xem BSPTagBundle nếu bạn muốn loại biểu mẫu giúp bạn với loại biến đó.

5

Bạn có thể sử dụng kiểu gõ mông hoặc bộ sưu tập mong muốn theo nhu cầu của mình.

Hash: Lưu trữ và truy lục giá trị dưới dạng mảng liên kết.

Bộ sưu tập: Lưu trữ và truy xuất giá trị dưới dạng mảng được lập chỉ mục bằng số.

Ví dụ:

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

Dữ liệu được lưu trữ như:

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

"country_wise_total_count": { 
    "NP": NumberInt(7), 
    "US" : NumberInt(10) 
    } 
Các vấn đề liên quan