2012-03-29 13 views
6

Ho cercato di scrivere "codice buono" e di utilizzare l'iniezione delle dipendenze per passare gli oggetti del database nei costruttori delle mie classi.Memorizzazione nella cache di oggetti MongoDB in PHP

Costruttori sono generalmente l'assunzione di questo modulo:

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

Ho notato che per ogni oggetto creato, viene creata una nuova MongoCollection. (Vale a dire l'accesso alla proprietà $db->collectionName restituisce due volte due oggetti distinti, non lo stesso oggetto)

ho usato una classe base stile ActiveRecord, in modo che gli oggetti sono in grado di CRUD stessi.

Ora quando utilizzo una sorta di funzione getAllRecords() e restituisco 100 di questi oggetti, vengono creati 100 di oggetti MongoCollection. (Un rapido sguardo alla fonte conducente sembra indicare nuovi oggetti vengono creati anche lì, non appena nuove rappresentazioni in PHP)

ho ottenuto intorno a questo avvolgendo sia Mongo e MongoDB classi per implementare la cache.

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

Le mie domande sono le seguenti:

  • È questo destinato comportamento di MongoDB? Dovrebbe davvero restituire un nuovo oggetto ogni volta, o è un bug/funzionalità nel driver PHP o Mongo stesso (esiste un caso d'uso per aver bisogno di 2 oggetti per la stessa collezione?)
  • causerò problemi per me stesso memorizzando nella cache entrambi gli oggetti MongoDB e MongoCollection creati e riutilizzandoli.
  • In che modo generalmente le persone gestiscono il lavoro con MongoDB? Dovrei usare completamente un approccio diverso? (Cioè DataMapper)

Grazie,

Leigh.

risposta

2

È intenzionale, poiché le raccolte hanno proprietà diverse dai loro nomi associati (w e woutout al momento, più pianificati per il futuro). Se tutto quello che ti interessa sono i nomi, allora va bene per metterli nella cache.

+0

Grazie a @kristina, penso che qualsiasi modifica che dovrei fare a w o wtimeout sarebbe la stessa in tutte le raccolte, quindi sembra essere solo il nome della collezione a cui tengo. Posso chiederti come gestisci in genere i tuoi oggetti dati? Usi ActiveRecord, DataMapper, qualcos'altro o semplicemente qualunque cosa sembra adattarsi meglio? – Leigh

+0

Ho scritto l'autista, quindi la mia conoscenza è per lo più teorica :) Gli utenti con più esperienza pratica sono probabilmente più qualificati per rispondere alla terza parte della domanda. – kristina

+0

So che hai scritto l'autista, è per questo che ti sto tormentando;) - Ma TY per il tuo tempo, so che ci sono alcuni ragazzi nella chat di PHP che usano Mongo, io vado e li infastidisco. – Leigh

1

Ho passato il MongoCollection ai miei oggetti invece che allo MongoDb. Il mio ragionamento era che scegliere la collezione nell'oggetto sarebbe stata una dipendenza nascosta (potrebbe essere eccessivo) e quindi nei miei test di unità, posso prendere in giro l'oggetto MongoCollection.

+0

I costruttori in realtà hanno 'parent :: __ construct ($ db-> collection)' in essi.* Il mio ragionamento * era che un oggetto sta bene sapendo quale sia la propria collezione e non volevo tenere traccia di centinaia di collezioni al di fuori dell'oggetto. – Leigh

Problemi correlati