2017-06-21 142 views
1

我有quiz1,quiz2和quiz3,我想根據來自quiz3的標籤向用戶推薦一個測驗,不論是測驗1還是測驗2,而不需要採集集合中的每個文檔並對其進行處理在應用程序級別上。如何找到最佳數組匹配

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,因爲quiz_3匹配quiz_2和2個標籤,匹配quiz_1和1個標籤。 (更多的標籤匹配等於更好的匹配)我如何使用貓鼬做到這一點?

說明:

我有一個集合名爲「測驗」和我想的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個標籤的quiz_1 –

+1

因此,您正在尋找每個術語的「最大交集」。但我不明白這是如何適用於「用戶」。用戶是否應該有自己的術語列表相交?請繼續解釋。在當然的問題。它似乎還沒有你想象的那麼清楚。 –

回答

1

基本上你想獲得比較陣列的$setIntersection$size"tags"陣列在文檔中。然後你$sort至頂得上最大的「大小」,終於$limit一個結果:

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至少有一個匹配的文件加快速度。