2015-06-25 37 views
0

這可能聽起來像是一個簡單的問題,但我已花費超過3小時來實現它,但我陷入了中途。如何在MongoDb中爲搜索到的文檔分配權重?

輸入

  1. 關鍵字列表的標籤
  2. 列表

問題陳述:我需要找到所有從數據庫中滿足以下條件的文件:

  1. 列出具有1個或多個匹配關鍵字的文檔。 (達到)
  2. 列出具有1個或多個匹配標籤的文檔。 (達到)
  3. 根據權重對查找到的文檔進行排序:每個關鍵字匹配攜帶2個點,每個標籤匹配攜帶1個點。

查詢:我如何達到要求#3。

我的嘗試:在我的嘗試中,我只能根據關鍵字匹配(也沒有將權重乘以2)列出。

標籤是文件的數組。每個標籤的結構是這樣

{ 
    "id" : "ICC", 
    "some Other Key" : "some Other value" 
} 

關鍵字字符串數組:

["women", "cricket"] 

查詢:

var predicate = [ 
    { 
     "$match": { 
      "$or": [ 
       { 
        "keywords" : { 
         "$in" : ["cricket", "women"] 
        } 
       }, 
       { 
        "tags.id" : { 
         "$in" : ["ICC"] 
        } 
       } 
      ] 
     } 
    }, 
    { 
     "$project": { 
      "title":1, 
      "_id": 0, 
      "keywords": 1, 
      "weight" : { 
       "$size": { 
        "$setIntersection" : [ 
         "$keywords" , ["cricket","women"] 
        ] 
       } 
      }, 
      "tags.id": 1 
     } 
    }, 
    { 
     "$sort": { 
      "weight": -1 
     } 
    } 
]; 

回答

4

看來,你在你試圖接近,但當然你需要實現一些東西來「匹配你的邏輯」,以獲得你想要的最終「分數」值。

這只是一個改變你的投影邏輯一點,假設兩個「關鍵詞」和「標籤」是在文檔中的陣列的事情:

db.collection.aggregate([ 
    // Match your required documents 
    { "$match": { 
     "$or": [ 
      { 
       "keywords" : { 
        "$in" : ["cricket", "women"] 
       } 
      }, 
      { 
       "tags.id" : { 
        "$in" : ["ICC"] 
       } 
      } 
     ] 
    }}, 

    // Inspect elements and create a "weight" 
    { "$project": { 
     "title": 1, 
     "keywords": 1, 
     "tags": 1, 
     "weight": { 
      "$add": [ 
       { "$multiply": [ 
        {"$size": { 
         "$setIntersection": [ 
          "$keywords", 
          [ "cricket", "women" ]    
         ] 
        }} 
       ,2] }, 
       { "$size": { 
        "$setIntersection": [ 
         { "$map": { 
          "input": "$tags", 
          "as": "t", 
          "in": "$$t.id" 
         }}, 
         ["ICC"] 
        ] 
       }} 
      ] 
     } 
    }}, 

    // Then sort by that "weight" 
    { "$sort": { "weight": -1 } } 
]) 

所以這裏basicallt的$map邏輯「轉換「另一個陣列,只給出id的值與您需要的」設置「解決方案進行比較。

$add運營商提供額外的「權重」,您想要「加重」你的迴應的成員。

+0

好主意在這裏使用'$ map' - 但我認爲你的查詢有一些包圍問題。 –

+0

這對我有用。謝謝@Blakes – guptakvgaurav

+0

卓越執行!值得注意的是,這種方法應該相當快。 –

相關問題