2016-11-23 70 views
0

我有含有一種叫searchTerms場蒙戈文件。這是一個包含單詞的數組。 [「字詞1」,「詞條2」,「TERM3」,「term4」]MongoDB的映射減少搜索條件

我想寫一個由相關文檔返回的功能。這意味着,與大多數文件查詢的searchCriteria內術語第一,接着下一個最高的量方面等

實施例:

文件:

{"_id":"1", "searchTerms":["a","b","c","d"]} 
    {"_id":"2", "searchTerms":["a","b","x","q"]} 
    {"_id":"3", "searchTerms":["a","e","x","n"]} 
    {"_id":"4", "searchTerms":["e","f","g","z"]} 

對於搜索術語:[「一」 ,「b」,「c」]結果應該是:

{"_id":"1", "searchTerms":["a","b","c","d"]} 
{"_id":"2", "searchTerms":["a","b","x","q"]} 
{"_id":"3", "searchTerms":["a","e","x","n"]} 

我已經寫了一個函數來做到這一點,但它非常複雜,我認爲效率低下。我在讀有關地圖減少和不知道它是否能在這種情況下幫助嗎?我絞盡腦汁試圖弄清楚如何做到這一點。我不確定它是否可以或不可以?如果是的話,有人可以告訴我它是如何工作的?

回答

1

一套簡單的操作就足夠了。使用$ setIntersection與輸入數組進行比較,並使用相交數組的$ project $大小進行比較。 $按大小遞減排序並投影最終響應。

aggregate([{ 
    "$project": { 
     "_id":0, 
     "fields" : "$$ROOT", 
     "matches": { 
      "$size": { 
       "$setIntersection": [ 
        "$searchTerms", ["a", "b"] 
       ] 
      } 
     } 
    } 
}, { 
    "$sort": { 
     "matches": -1 
    } 
}]) 
+0

嗨Veeram,哇謝謝你的回答太棒了!我沒有意識到它可以被濃縮這麼多...只是一對夫婦的問題。如果我想包含文檔中的所有字段,是否需要在第一個$項目中特別包含全部內容?即「field1」:1,「field2」:1? –

+1

如果要包含所有字段,則可以在第一個項目中使用「字段」:$$ ROOT,但這也包含計算字段「匹配」。所以要麼是$$ ROOT,要麼你只需要在第一個項目中特別包含。 – Veeram

+0

Veeram我不能夠感謝你!天才 –