2017-06-21 26 views
1

私はquiz1、quiz2、およびquiz3を持っています。そして、quiz3からのタグに基づいてquiz1またはquiz2のいずれかをユーザに提示する必要があります。アプリケーションレベルでquiz_3は2個のタグとquiz_2一致し、わずか1タグでquiz_1一致するため、ここで最適な配列の一致を見つける方法

Quiz_1 = {             
    _id:"...",             
    tags:["life-style","personality","sports","soccer"]   
}; 

Quiz_2 = { 
    _id:"...", 
    tags:["IQ","inteligence","science","maths"] 
}; 

Quiz_3 = { 
    _id:"...",             
    tags:["life-style","maths","inteligence","school"]   
}; 

ベストマッチは、quiz_2です。 (より多くのタグマッチはより良いマッチに等しい)どのように私はマングースを使ってそれをするのですか?

説明:

私は「クイズ」という名前のコレクションを持っていると私は私が(タグ入力すると、第2の文書を返すようにするMongoDBたい:[「ライフスタイル」、「数学」、「知能」、「学校を「])

quizzes: 
[ 
    { 
    _id:..., 
    tags:["life-style","personality","sports","soccer"]] 
    }, 
    { 
    _id:"...", 
    tags:["IQ","inteligence","science","maths"] 
    }, 
    { 
    _id:"...", 
    tags:["life-style","maths","inteligence","school"] 
    } 
] 
+1

明らかに?どうして?理由を説明できると思いますか? –

+0

quiz_3は2つのタグを持つquiz_2と一致し、1つのタグ –

+1

と一致するので、それぞれの用語に対して "セットの最大の交差点"を探しています。私はそれが "ユーザー"にどのように当てはまるか見ることはできません。ユーザーは、交差する用語のリストを所有することになっていますか?説明を続けてください。もちろん、問題です。あなたが思うようにはっきりとしたものではありません。 –

答えて

1

基本的には、比較配列と文書で"tags"配列の$setIntersection$sizeを取得したいです。

var compare = ["life-style","maths","inteligence","school"]; 

Quizzes.aggregate([ 
    { "$match": { "tags": { "$in": compare } } }, 
    { "$project": { 
    "size": { 
     "$size": { 
     "$setIntersection": [ compare, "$tags" ] 
     } 
    } 
    }}, 
    { "$sort": { "size": -1 } }, 
    { "$limit": 1 } 
]) 

あなたが唯一の実際$inを使用することによって、少なくとも1つの試合を持っている文書を調べることによって、それをスピードアップ:次に、あなた$sortは最大の上部にある「サイズ」、そして最終的に$limit 1に結果を取得します。

関連する問題