4

Model :: find()から返されたDocumentSetをmemcachedに保存したいと思います。ただし、キャッシュから結果を取得した後で結果を処理しようとすると、以下のMongoExceptionが発生します。if ($this->_resource->hasNext())具体的には、foreachを使用する場合、\ data \ source \ mongo_db\Result.phpの63行目を呼び出すと例外がスローされます。

MongoException

MongoCursorオブジェクトがコンストラクターによって正しく初期化されていません

なぜそうなるのか理解できます。

私の質問は、Model :: find()を事前入力するか、データを操作できるように独自のDocumentSetを作成する方法はありますか?通常は、配列に変換してキャッシュに保存します。ただし、作成したModelメソッドの一部にアクセスする必要があります(例:Customer :: fullName())

更新:私は、大丈夫ですが素晴らしいとは言えないちょっとした問題を見つけました。Model :: find()の結果を配列としてキャッシュに保存しています$result->to('array')。次に、取得時に$ resultsをループし、Model::create($result, array("exists" => true)$resultごとに新しい配列にデータを入力します。

4

1 に答える 1

4

DocumentSetによって返されるにModel::findは、Mongodbカーソルが含まれます。アイテムが繰り返されるまで、データベースからすべてのデータがロードされるわけではありません。各アイテムが繰り返されると、aDocumentが作成され、メモリ内でDocumentSetオブジェクトにキャッシュされます。組み込みのphp関数iterator_to_array()を使用して、DocumentSetをキャッシュ可能なドキュメントの配列に変換できます。

アップデートで述べたように->to('array')、キャッシュの準備Model::create()とバックアップの構築にも使用できます。このメソッドに関する1つの注意点:使用する->to('array')と、MongoIdオブジェクトとMongoDateオブジェクトもそれぞれ文字列と整数にキャストされます。$_schemaモデルにを定義し'id''date'タイプを設定した場合、それらは、によって返されるドキュメント内の元のMongoIdオブジェクトとMongoDateオブジェクトにキャストバックされModel::create()ます。すべてのフィールドのスキーマがない場合は、問題になる可能性があります。最近、ネイティブのmongoオブジェクトをキャストせずに実行できるようにするプルリクエスト->to('array')があります(サブドキュメントの配列内で常にキャストされるmongoオブジェクトの問題も修正されています)。

FWIW、私は実際にはデータだけをキャッシュに保存することを好みます。これは、phpオブジェクト全体をシリアル化するよりもスペースが少なく、クラスが定義されていない、またはアイテムがキャッシュからプルされたときに他のアイテムが初期化されないという潜在的な問題を回避できるためです。

私はこれを試していません...しかし、これを透過的に処理するキャッシュ戦略クラスを作成できると思います。Lithiumを非常に柔軟で強力なフレームワークにするための細心の注意のもう1つの例。 http://li3.me/docs/lithium/storage/cache/strategy

于 2012-09-09T05:08:09.493 に答える