Как сделать поиск текста со счетом от mongodb в метеоре? - PullRequest
0 голосов
/ 19 февраля 2020

В mongodb я могу сделать это:

db.getCollection('keywords').find(
   { $text: { $search: "I have headache" } },
   { score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )

результат

{
    "_id" : "ux2dpeYKQCQRgdbzB",
    "keyword" : "Headache",
    "createdAt" : ISODate("2020-02-10T01:45:07.670Z"),
    "createdBy" : "a5oNybXwHKB8DkxdB",
    "score" : 1.33333333333333
}

и я хочу сделать это в метеоре:

Keywords.find(
                { $text: { $search: keyword } },
                { score: { $meta: "textScore" }, sort: { score: { $meta: "textScore" } } }
            ).fetch()

но он получит ошибку :

MongoError: must have $meta projection for all $meta sort keys

Я пытался так без сортировки

Keywords.find(
                { $text: { $search: keyword } },
                { score: { $meta: "textScore" } }
            ).fetch()

, но я не получаю поле оценки в этом документе:

{
    "_id" : "ux2dpeYKQCQRgdbzB",
    "keyword" : "Headache",
    "createdAt" : ISODate("2020-02-10T01:45:07.670Z"),
    "createdBy" : "a5oNybXwHKB8DkxdB"
}

как решить этот текстовый поиск в метеоре и сортировать по баллам?

спасибо

1 Ответ

0 голосов
/ 21 февраля 2020

Странно! Я скопировал ваш код ниже, хотя и изменил его, добавив индекс:

// server/index.js
const Keywords = new Mongo.Collection('keywords');
Keywords.rawCollection().createIndex({ keyword: 'text' });
const simpleQuery = Keywords.find(
  { $text: { $search: 'Headache' } },
  { score: { $meta: 'textScore' } },
).fetch();
console.log(simpleQuery);

// MongoDB
{
    "_id" : "ux2dpeYKQCQRgdbzB",
    "keyword" : "Headache",
    "createdAt" : ISODate("2020-02-10T01:45:07.670Z"),
    "createdBy" : "a5oNybXwHKB8DkxdB"
}

И он прекрасно работает!

...