2

PHPとMongoDBを使用して最初のアプリケーションを作成しようとしています。

私が作成しようとしているのは、特定の地域の果樹のリストです。また、ある地域で栽培できる果樹のリストも必要です。

私はMySQLのバックグラウンドを持っているので、SQLの場合、ツリーに関する情報を含むツリーテーブルがあります。私が実際の木のテーブルを持っているよりも、それは木のテーブルとIDで結合されたままになり、場所やその他の情報もあります。

ただし、Mongoでは、これがどのように行われるのか、またはどのように行われるべきかがわかりません。

私が欲しいのは、木のリストであり、ユーザーが自分のツリーについて参照できるようにすることです。

これがどのように素晴らしいかについての助けや指示。

$db->trees->fruittrees
$db->tress->userstrees 

クリス

4

3 に答える 3

1

ただし、あなたの質問には欠けているものがかなりあります。

私が作成しようとしているのは、特定の地域の果樹のリストです。また、その地域で栽培できる果樹のリストも必要です。

地理空間クエリのようなにおいがします: http://docs.mongodb.org/manual/core/geospatial-indexes/

したがって、ユーザーには場所があります。

{
    name: 'sammaye',
    location: [107,206]
}

そして、成長する各ツリーは、一連の領域を利用できます。

{
    name: 'apple tree'
    locations_of_growth: [[74,59],[67,-45]]
}

そして、地球の距離 ( http://docs.mongodb.org/manual/core/geospatial-indexes/#distance-calculation$near ) に相当するユーザーに対してクエリを実行して、そのユーザーの近くに存在する木を計算するだけです。

地理空間クエリに関する問題は、さらに詳しい情報で制約できることです。そのため、ユーザーがその地域のリンゴの木の葉の色を比較して、その地域で緑の葉を持っているリンゴの木がいくつあるかを調べられるようにしたいとします。それをツリードキュメント内の条件として追加し、$near.

地理空間クエリには欠点が 1 つあります。それは、コレクションごとに 1 つのインデックスしか持てないことです ( http://docs.mongodb.org/manual/core/geospatial-indexes/#create-a-geospatial-index )。は、その地域に植えることができる木のリストも提供したい場合、 という名前のコレクションと という名前の 2 つのコレクションが必要になる可能性があることを意味しother_treesますgrowable_species。ユーザーがクエリを実行した領域内で自分の木を他のツリーと比較できるようにしたい場合、およびクエリを実行other_treesした領域内で成長できる木をユーザーが表示できるようにしたい場合は、クエリを実行できますgrowable_trees

もちろん、これはこれを行うための 1 つの方法にすぎません。

編集

私は Doctrine の使用を「推奨」しません。それはあなた次第であり、シナリオによって異なります。Doctrine は非常に重く、驚くほど遅い ORM であり、PHP 用の高速で軽量な ORM がたくさんあります: http://docs.mongodb.org/ecosystem/drivers/php-libraries/ ORM とは、フル スタック フレームワークを使用している場合や、ドライバーを単独で使用したい場合です。

また、MongoDB では、JSON PHP (それが何であれ) の処理に関する知識は必要ありません。MongoDB からのすべての結果は BSON としてドライバーに入り、PHP 内の標準の辞書、つまり連想配列に逆シリアル化されます。ここでは、JSON PHP 処理の知識は必要ありません。

また、他の回答とは異なり、「すべての情報を単一の JSON ドキュメントに保存する」ことに非常に注意してください。つまり、MongoDB は JSON ではなく BSON であるため、埋め込みは非常に慎重に検討する必要があり、シナリオに適合するかどうかを判断する必要があるためです。 . 実際、ほとんどの場合、s 以外のものを他の行に埋め込む_idと問題が発生する可能性がありますが、前述したように、それはシナリオに依存します。

于 2013-02-19T08:18:41.003 に答える
0

Mongo でデータをモデル化する場合、UI でデータをどのように使用するかに依存することがよくあります。Mongo は結合を行うのが得意ではありませんが (ご存じのとおり)、それでも実行できます。これらは、中間層または UI で実行できます。

したがって、あなたの例では、おそらく次のようにします。

ツリー コレクション内のツリー:


{
   "_id" : 123,
   "name" : "Orange",
   "price" : 10,
   "climate" : "Any"
}

ユーザー:


{
   "user" : "Bob",
   "selected_trees" : [ 123, 124, 156 ]
}

次に、UI で Bob をロードし、使用可能なツリー コレクションを 1 回呼び出して、Bob のツリーの詳細を取得します。

また、一般的な方法は、ユーザーに完全なツリー オブジェクトを実際に含めることです。リレーショナルな背景に由来するこの考えに嫌悪感を覚えるでしょうが、Mongo ではよくあることです。いたるところに同じデータのコピーがあります。それは正常であり、予想されます。

于 2013-02-19T03:42:51.720 に答える
0

MongoDB はドキュメント指向のデータベースです。これは、MySQL または別のリレーショナル データベースで使用されているように、モデルをまったく異なるように設計する必要があることを意味します。たとえば、ユーザー情報 (ユーザーが所有するツリーを含む) を保存する場合は、そのすべての情報を 1 つの JSON ドキュメントに保存する必要があります。詳しくはこちらをお読みください

また、MongoDB にオブジェクトを格納できる Doctrine を使用することをお勧めします。これにより、データベースのモデル化がはるかに簡単になり、オブジェクトを表すオブジェクト指向モデルを作成するだけで済みます。こちらのページをご参照ください

このためには、JSON PHP の処理とオブジェクト指向プログラミングの知識が必要です。MySql の使用から No-Sql データベースへの移行の開始時に常に役立つことの 1 つは、データベースをモデル化してからテーブルを非正規化することです。これにより、オブジェクト/ドキュメントに入れる必要があるすべての情報を知ることができます。

これがお役に立てば幸いです

于 2013-02-19T03:37:07.370 に答える