2012-03-29 42 views
6

Tôi đã cố gắng để viết "mã tốt" và sử dụng tiêm phụ thuộc để vượt qua các đối tượng cơ sở dữ liệu trong các nhà xây dựng của các lớp học của tôi.Caching MongoDB đối tượng trong PHP

Constructors thường đang dùng hình thức này:

public function __construct(MongoDB $db) { 
    $this->collection = $db->collectionName; 
} 

tôi đã nhận thấy rằng đối với mỗi đối tượng được tạo ra, một mớiMongoCollection được tạo ra. (Ví dụ: truy cập vào $db->collectionNametài sản hai lần trả hai đối tượng riêng biệt, không phải là cùng một đối tượng)

Tôi đã sử dụng một lớp cơ sở ActiveRecord phong cách, do đó đối tượng có khả năng CRUD mình.

Bây giờ, khi tôi sử dụng một số chức năng getAllRecords() và trả lại 100 trong số các đối tượng này, 100 trong số MongoCollection đối tượng được tạo. (Xem nhanh nguồn trình điều khiển dường như chỉ ra các đối tượng mới được tạo ở đó, không chỉ các biểu diễn mới trong PHP)

Tôi đã giải quyết vấn đề này bằng cách gói cả các lớp MongoMongoDB để thực hiện bộ nhớ đệm.

class MyMongo extends Mongo 
{ 
    private $objectCache = array(); 

    public function __get($name) { 
     return array_key_exists($name, $this->objectCache) 
      ? $this->objectCache[$name] 
      : $this->objectCache[$name] = new MyMongoDB($this, $name); 
    } 
} 

class MyMongoDB extends MongoDB 
{ 
    private $objectCache = array(); 

    public function __get($name) { 
     return array_key_exists($name, $this->objectCache) 
      ? $this->objectCache[$name] 
      : $this->objectCache[$name] = new MongoCollection($this, $name); 
    } 
} 

Câu hỏi của tôi là như sau:

  • Đây có phải là ý định hành vi của MongoDB? Nếu nó thực sự trả về một đối tượng mới mỗi lần, hoặc nó là một lỗi/tính năng trong trình điều khiển PHP hoặc bản thân Mongo (có một trường hợp sử dụng để cần 2 đối tượng cho cùng một bộ sưu tập không?)
  • Tôi sẽ gây ra vấn đề cho bản thân mình bằng cách lưu vào bộ nhớ cache một trong hai/MongoDBMongoCollection các đối tượng được tạo và sử dụng lại chúng.
  • Những người khác thường xử lý thao tác với MongoDB như thế nào? Tôi có nên sử dụng một cách tiếp cận hoàn toàn khác không? (Tức là DataMapper)

Cảm ơn,

Leigh.

Trả lời

2

Đó là cố ý, vì các bộ sưu tập có các thuộc tính khác với tên của chúng được liên kết với chúng (w và wtimeout vào lúc này, được lên kế hoạch nhiều hơn cho tương lai). Nếu tất cả những gì bạn quan tâm là tên, thì tốt nhất là hãy lưu chúng.

+0

Cảm ơn @ kristina, tôi nghĩ rằng bất kỳ thay đổi nào tôi cần phải thực hiện cho w hoặc wtimeout sẽ giống nhau trên tất cả các bộ sưu tập, vì vậy nó dường như chỉ là tên của bộ sưu tập mà tôi quan tâm. Tôi có thể hỏi cách bạn thường quản lý các đối tượng dữ liệu của mình không? Bạn có sử dụng ActiveRecord, DataMapper, cái gì khác, hoặc chỉ đơn giản là bất cứ điều gì có vẻ phù hợp nhất? – Leigh

+0

Tôi đã viết trình điều khiển, vì vậy kiến ​​thức của tôi về nó chủ yếu là lý thuyết :) Người dùng có kinh nghiệm thực tế hơn có lẽ tốt hơn đủ điều kiện để trả lời phần thứ ba của câu hỏi của bạn. – kristina

+0

Tôi biết bạn đã viết trình điều khiển, đó là lý do tại sao tôi làm phiền bạn;) - Nhưng TY cho thời gian của bạn, tôi biết có một số người trong cuộc trò chuyện PHP người sử dụng Mongo, tôi sẽ đi và lỗi chúng. – Leigh

1

Tôi đã chuyển số MongoCollection vào đối tượng thay vì MongoDb. Lý do của tôi là việc chọn bộ sưu tập trong đối tượng sẽ là một phụ thuộc ẩn (có thể là quá mức cần thiết) và sau đó trong các bài kiểm tra đơn vị của tôi, tôi có thể thử đối tượng MongoCollection.

+0

Các hàm tạo của tôi thực sự có 'parent :: __ construct ($ db-> collection)' trong chúng.* Lý do của tôi * là một đối tượng là tốt khi biết bộ sưu tập của nó là gì, và tôi không muốn phải theo dõi 100 bộ sưu tập bên ngoài đối tượng. – Leigh

Các vấn đề liên quan