2017-04-22 135 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']); 
     } 
    } 
);