2017-04-22 140 views
0
recipe.find({ 
    $text: { 
     $search: req.query.search, 
     $diacriticSensitive: true 
    } 
}, { 
    score: { 
     $meta: "textScore" 
    } 
} 
,function(err, data) { }); 

我用的貓鼬的文本搜索功能根據其得分結果進行排序。我還需要列出不匹配的記錄到列表的底部。我可以做到這一點嗎? 有沒有什麼方法可以顯示零分的回合?

回答

1

您可以通過對文本搜索和總是返回true的語句執行'OR'來返回'recipe'中的所有文檔,甚至是不匹配的文檔。不匹配的結果將得到0分。這樣做的副作用似乎是,Mongo不想按文本分數排序(如果嘗試在mongo控制檯上排序),但這不應該是一個問題在你的情況下,因爲你可以很容易地在客戶端進行排序(例如,使用lodash等)。示例代碼(未測試):

recipe.find({ 
     $or: [{ 
      $text: { 
       $search: req.query.search, 
       $diacriticSensitive: true 
      } 
     }, { 
      _id: { 
       $exists: true 
      } 
     }] 
    }, { 
     score: { 
      $meta: "textScore" 
     } 
    }, 
    function(err, data) { 
     if (data) { 
      data = _.map(data, function(d) { 
       return d.toObject(); 
      }); 
      data = _.orderBy(data, ['score'], ['desc']); 
     } 
    } 
);