最初に決定するのは、使用するツリーの種類です。
あなたのデータとアクセスパターンを考慮する大きな点があります。既にすべての作業の90%が照会されており、それの音(電子商取引)による更新は管理者によってのみ実行されることはほとんどありません。
スポーツからバスケットボール - >メンズ、スポーツ - >テニス - >ウィメンズのように、子どものパスをすばやく照会できるスキーマが必要です。本当に拡張する必要はありません更新する。
MongoDBはこのための良いドキュメントページを持っています:http://docs.mongodb.org/manual/tutorial/model-tree-structures/ 10genは実際には木のための異なるモデルとスキーマメソッドを記述し、それらの主要な浮動小数点数を記述します。
あなたは簡単に照会するために探している場合は、目をキャッチする必要があります1マテリアライズド・パスされています。これは、例えば上で照会するので、木を構築するために非常に興味深い方法であるhttp://docs.mongodb.org/manual/tutorial/model-tree-structures/#model-tree-structures-with-materialized-paths
あなたは「レディース」に上記ましたあなたのツリーの特定のパスの下にリストされているすべての製品を見つけるために
db.products.find({category: /^Sports,Tennis,Womens[,]/})
:そうのように:「テニス」で、あなたは、単に(http://docs.mongodb.org/manual/reference/operator/regex/インデックスを使用することができます)事前に固定正規表現を行うことができます。
残念ながら、カテゴリを移動したり名前を変更したりすると、すべての製品を更新する必要があり、1つのカテゴリに数千の製品が存在する可能性があります。
より良い方法は、製品にcat_id
を収容して、スキーマを使用して別のコレクションにカテゴリを分離するために、次のようになります。
{
_id: ObjectId(),
name: 'Women\'s',
path: 'Sports,Tennis,Womens',
normed_name: 'all_special_chars_and_spaces_and_case_senstive_letters_taken_out_like_this'
}
だから今、あなたのクエリが唯一の彼らは非常に作るべきカテゴリのコレクションを伴いますより小さく、より多くの演奏。ただし、カテゴリを削除すると、製品に触れる必要があります。
だから、「Badmin」に「テニス」を変更する例:あなたは少しあるクライアント側を、それらを引き出す必要がありますので、
db.categories.update({path:/^Sports,Tennis[,]/}).forEach(function(doc){
doc.path = doc.path.replace(/,Tennis/, ",Badmin");
db.categories.save(doc);
});
あいにくのMongoDBは、現時点では何で、クエリ文書の反射を提供していませんしかし、うまくいけば、あまりにも多くのカテゴリが戻ってくる必要はありません。
これは基本的には本当に動作します。更新するのはちょっと難しいですが、インデックスを使ってどのパスでも即座に問い合わせることのできる能力は、私が信じるシナリオにはもっと適しています。
もちろん、このスキーマはネストされたセットモデルと互換性があります:http://en.wikipedia.org/wiki/Nested_set_model私は時間と時間をもう一度見つけましたが、例えば、テニスは「スポーツ」と"余暇"とあなたは、ユーザーがどこから来たかに応じて複数のパスが必要です。
マテリアライズドパスのスキーマだけで簡単に、単純な別のpath
を、追加することによって、これをサポートしています。
それは意味がある、かなり長いものがあることを望みます。すべてのカテゴリが異なっている場合
パスはMongoDBのドキュメントリンクは5つのアプローチではなく、1を示していますし、私は三番目は、あなたのユースケースのために完璧に十分なようだと思う – Sammaye
を更新する時に遅いしばらく照会で強いマテリアライズド。 –