2017-08-01 13 views
1

私はmongodbリポジトリに大量のデータがあり、入力があればデータを検索して分類する必要があります。戻り値配列の比較の一致率

私は、リクエストを処理して応答を与えるサーバーを用意する予定ですが、どのアルゴリズム、bigdataツール、またはmongodbコマンドを使用するのかはわかりません。

これは私がする必要がある例です。

私は、このデータベースがあります。

[ 
    { 
     id: 1, 
     Colors: ["Green","Red","Blue","Yellow"] 
    }, 
    { 
     id: 2, 
     Colors: ["Green","Red","Blue"] 
    }, 
    { 
     id: 3, 
     Colors: ["Green","Red"] 
    }, 
    { 
     id: 4, 
     Colors: ["Green"] 
    } 
] 

そして、私は持っているが、この入力

String x = "Green Red" 

または

{ Colors: ["Green","Red"]} 

のようなJSONそしてそれは、この一致するデータを返します入力:

[ 
    { 
     id: 4, 
     Colors: ["Green"], 
     Matches: 100% 
    } 
    { 
     id: 3, 
     Colors: ["Green","Red"], 
     Matches: 100% 
    }, 
    { 
     id: 2, 
     Colors: ["Green","Red","Blue"], 
     Matches: 66% 
    }, 
    { 
     id: 1 
     Colors: ["Green","Red","Blue","Yellow"], 
     Matches: 50% 
    } 
] 
+0

は、あなたの質問に対処していないと信じて答えに何かはありますか?もしそうなら、正確に答えなければならないものを明らかにするために答えにコメントしてください。実際にあなたが質問した質問に答えた場合は、[あなたの回答を受け入れる](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)に質問してください。尋ねる –

答えて

0

簡単に言えば、ソース入力からの肯定的な一致によって$filterの配列を作成し、結果の$sizeと元の配列を比較します。テクニックは基本的にバージョン間で若干異なりますが、:

db.getCollection('junk').aggregate([ 
    { "$addFields": { 
    "Matches": { 
     "$trunc": { 
     "$multiply": [ 
      { "$divide": [ 
      { "$size": { 
       "$filter": { 
       "input": "$Colors", 
       "as": "c", 
       "cond": { "$in": [ "$$c", ["Green","Red"] ] } 
       } 
      }}, 
      { "$size": "$Colors" } 
      ]}, 
      100 
     ] 
     } 
    } 
    }} 
]) 

あなたは$setIntersection代わりに限り、比較値とアレイの両方が「ユニーク」の要素が含まれているよう$filterを使用して逃げることができるかもしれません。

db.getCollection('junk').aggregate([ 
    { "$addFields": { 
    "Matches": { 
     "$trunc": { 
     "$multiply": [ 
      { "$divide": [ 
      { "$size": { 
       "$setIntersection": [ "$Colors", ["Green", "Red"] ] 
      }}, 
      { "$size": "$Colors" } 
      ]}, 
      100 
     ] 
     } 
    } 
    }} 
]) 

そして、あなたはあなただけの残りを破棄する$mod$subtractを使用して計算を行うことができます$floor$truncを持っているか、いない場合:

db.getCollection('junk').aggregate([ 
    { "$project": { 
    "id": 1, 
    "Colors": 1, 
    "Matches": { 
     "$let": { 
     "vars": { 
      "perc": { 
      "$multiply": [ 
       { "$divide": [ 
       { "$size": { 
        "$setIntersection": [ "$Colors", ["Green", "Red"] ] 
       }}, 
       { "$size": "$Colors" } 
       ]}, 
       100 
      ] 
      } 
     }, 
     "in": { 
      "$subtract": [ "$$perc", { "$mod": [ "$$perc", 1 ] } ]  
     } 
     } 
    } 
    }} 
]) 

は、一般的にかかわらず、同じ原理をご利用いただけます。

「配列の長さの合計で割った一致の数が一致の割合に等しい」

関連する問題