2016-11-11 5 views
3

При непосредственном взаимодействии с апи MongoDB, вы можете сделать полнотекстовый поиск и сортировку оценки результата как это:

db.someCollection 
    .find({ $text: { $search: "some search phrase" } }, 
      {score: { "$meta":"textScore" }) 
    .sort({ score: { $meta:"textScore"} }) 

Как вы перевести это на Loopback фильтр?

Я попытался это, который не удалось:

{ 
     "where":{ 
      "$text" : { "search":"some search phrase" } 
     }, 
     "fields": { 
      "score":{ 
       "$meta":"textScore" 
      } 
     }, 
     "orderby":"score ASC" 
} 

К сожалению, это приводит:

[ 
    {}, 
    {}, 
    {} 
] 

Когда я смотрю на выходе профиля MongoDB, я считаю, что Loopback сгенерировал этот запрос:

"filter" : { 
     "$text" : { 
      "$search" : "some search phrase" 
     } 
    }, 
    "sort" : { 
     "score" : 1 
    }, 
    "projection" : { 
     "score" : 1 
    } 

Так что это проект «оценка», как если бы это было нормальное поле, а не мета-мета поле ... и это в результате исключает все остальные поля.

Как получить петлевой генерировать правильный запрос, который должен выглядеть следующим образом: при выполнении

"filter" : { 
     "$text" : { 
      "$search" : "some search phrase" 
     } 
    }, 
    "sort" : { 
     "score" : { 
      "$meta" : "textScore" 
     } 
    }, 
    "projection" : { 
     "score" : { 
      "$meta" : "textScore" 
     } 
    } 

Thx.

ответ

0

Мне удалось получить эту работу в Loopback, используя агрегат вместо метода find.

const db = Vehicletest.getDataSource().connector; 
const collection = db.collection(Vehicletest.modelName); 
var cursor = collection.aggregate([{ $match: { $text: { $search: searchText } } }, { $sort: { score: { $meta: "textScore" } } }, { $project: { name: 1 } }], {cursor: { batchSize: 1 }}); 
cursor.toArray(function(err, docs){ 
    console.log(docs); 
}); 

Если вы посмотрите на textSearch в документации по монго. Существует подразделение под названием «text-search-in-aggregation», в котором содержится более подробная информация. Надеюсь это поможет!