5

私はMongoDBが初めてです。MongoDB のパフォーマンスについて、設計上の質問があります。Name と Director という 2 つのプロパティを持つクラス Movies があるとします。また、この Movie Class にタグを付けたいと思います。このクラスに string[] の新しいプロパティを追加するか、新しいクラス MovieTags を作成する方がよいでしょうか? UI でオートコンプリートを使用するため、このタグを頻繁に照会することはわかっています。このオートコンプリート機能では、 Movie オブジェクトではなく、タグのみが必要です。どのオプションが良いですか?String[] のプロパティまたは MovieTags のコレクションへの参照を追加しますか? パフォーマンスを考えて...もちろん、どちらの場合もインデックス作成が行われます。

MapReduce を使用する必要がありますか? タグのみを選択するには、埋め込み文字列 [] オブジェクトを使用する場合にオートコンプリート機能を使用しますか? どのように?

ありがとう!

4

2 に答える 2

6

私はおそらく、タグを文字列配列フィールドに格納する次のようなスキーマを使用します。

db.movies.insert({
    name: "The Godfather",
    director: "Francis Ford Coppola",
    tags: [ "mafia", "wedding", "violence" ]
})

db.movies.insert({
    name: "Pulp Fiction",
    director: "Quentin Tarantino",
    tags: [ "briefcase", "violence", "gangster" ]
})

db.movies.insert({
    name: "Inception",
    director: "Christopher Nolan",
    tags: [ "dream", "thief", "subconscious" ]
})

このタイプのクエリではmap-reduceは必要ありません。映画ドキュメント内にタグを埋め込むことで、MongoDBのマルチキー機能を利用し、次のような単一のfind()クエリを使用して特定のタグを持つ映画を検索できます。

db.movies.find( { tags: "dream" } )

また、おっしゃるように、クエリのパフォーマンスを向上させるために、マルチキー配列にインデックスを追加することも価値があります。

db.movies.ensureIndex( { tags: 1 } )
于 2011-05-21T01:25:28.713 に答える
2

クエリ結果の一部として返されるフィールドは、いつでもフィルター処理できます。

その方法を詳しく説明しているドキュメントへのリンクはhttp://docs.mongodb.org/manual/tutorial/query-documents/#Querying-FieldSelectionです

これにより、関心のないムービー オブジェクトの部分を除外できます。

于 2011-05-22T22:35:18.200 に答える