2012-05-11 14 views
0

私たちは、特定の投稿について、それが主に関連する投稿のリストを返す必要がある、投稿分析の要件を持っています。投稿の共通タグ例えば:MongoDBの2つのリストの交差を数えてソートする

postA = {"author":"abc", 
     "title":"blah blah", 
     "tags":["japan","japanese style","england"], 
    } 

存在のようなタグを有する他の記事であってもよい。

postB:["japan", "england"] 
postC:["japan"] 
postD:["joke"] 

ので、基本的に、postB 2つのカウントを取得ポスタのタグと比較するとき、POSTC 1カウントを取得します。 postDは0を返し、結果には含まれません。

マップ/リダクションを使用して結果を生成することを前提としていますが、map/reduceの基本的な使い方を理解していますが、この特定の目的のための解決策を見つけることはできません。

助けが必要ですか?または、カスタム仕分け機能のような優れた方法がありますか?私は現在Python開発者としてpymongodbを使用しています。

答えて

1

あなたはタグにインデックスを作成する必要があります

db.posts.ensure_index([('tags', 1)]) 

をし、ポスタと少なくとも一つのタグを共有する記事を検索:

posts = list(db.posts.find({_id: {$ne: postA['_id']}, 'tags': {'$in': postA['tags']}})) 

そして最後に、ソートPythonで交差点での:

key = lambda post: len(tag for tag in post['tags'] if tag in postA['tags']) 
posts.sort(key=key, reverse=True) 

postAが少なくとも1つのタグと他の多数の投稿を共有している場合、これは不可能であることに注意してくださいあなたがあなたのアプリケーションにMongoからたくさんのデータを送るからです。残念ながら、Mongo自体を使用して交差点のサイズ分をソートして制限する方法はありません。

関連する問題