2016-11-23 20 views
0

私はsearchTermsというフィールドを含むmongoドキュメントを持っています。これは単語が入った配列です。 ["term1"、 "term2"、 "term3"、 "term4"]mongodb map検索条件を減らす

関連性によってドキュメントを返す関数を記述したいと思います。

ドキュメント:

{"_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"]} 

検索用語の場合:[「A」それはそれ等のsearchCriteria内で最も検索用語は、次の最高額の用語を最初に続いているとの文書

例意味します、「B」、「C」]結果は次のようになります。私はこれを行うための機能を書かれている

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

は、しかし、それは非常に複雑だと私は非効率的だと思います。この状況で助けになるかどうか私はマップの削減と疑問について読んでいたのですか?私は自分の脳がどのようにこれを行うことができたかを試してみました。それができるかどうかわからないのですか?はいの場合、誰かがそれがどのように機能するか教えてください。

答えて

1

単純なセット演算子で十分です。入力配列と$ array $ array $ arrayの配列に$ setIntersectionを使用します。 $ sortはサイズの降順で、最終的な応答を投影します。

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

こんにちはVeeram、あなたの答えは素晴らしいです!私はそれがあまり凝縮されるかもしれないことを理解していませんでした...ちょうど2つの質問。ドキュメントのすべてのフィールドを含める場合は、特にすべてを最初の$プロジェクトに含める必要がありますか?私。 "field1":1、 "field2":1? –

+1

すべてのフィールドを含める場合は、最初のプロジェクトでは "fields":$$ ROOTを使用できますが、これには計算フィールド "matches"も含まれます。したがって、$$ ROOTか、最初のプロジェクトに特別に含める必要があります。 – Veeram

+0

ヴェラム私は十分にあなたに感謝することができません! Genius –