2016-12-04 1 views
0

Я хотел бы реализовать словарь, чтобы проверить правильность написания какого-либо текста. В этом словаре есть 20 000 слов. Мое приложение (которое является метеорным приложением) сначала загрузит текст. Теперь я бы разделил этот текст на слова и проверил, есть ли каждый из них в словаре.MongoDB: Как реализовать поисковый словарь для проверки текста

Но разве это технически лучший способ? Текст со 100 словами, будет иметь 100 вызовов БД, что не очень хорошо. Но и это не имеет смысла для меня, чтобы загрузить 20.000 слова укомплектовать в массиве, чтобы сделать поиск ...

let incorrect = []; 
text.split(' ').forEach(word => { 
    if (!Dictionary.findOne({ word: word })) { 
     incorrect.push(word); 
    } 
}) 

if (incorrect.length) 
    console.log('There is a spelling mistake'); 
else 
    console.log('Everything seems to be correct'); 

Другим способом, которым я думал, это разослать массив с расщепленными словами в запросе и получить все недостающие элементы в результате (массив). Но я не знаю, может ли это сделать mongoDB.

ответ

0

Вы найдете все слова в тексте, которые находятся в базе данных. Так что, если текст содержит 100 слов, должно быть 100 документов соответственно, если не то, что означает, что есть что-то не так с текстом:

const arr = text.split(' '); 
const wordCount = arr.length; 

const docCount = Dictionary.find({ 
    word: { 
    $in: arr, 
    }, 
}).count(); 

if (wordCount !== docCount) { 
    console.log('There is a spelling mistake'); 
} 

Update

Если вам нужно, чтобы получить слова с ошибками, вы просто использовали бы функцию diff на входе arr и слова результата, найденные в db. Я полагаю, у вас есть underscore установлен, я использую _.difference, чтобы получить результат:

const arr = text.split(' '); 

const foundWord = Dictionary.find({ 
    word: { 
    $in: arr, 
    }, 
}).map(obj => obj.word); 

const misspelledWords = _.difference(arr, foundWord); 

console.log(misspelledWords); 
+0

Хорошая идея. Но это не даст мне слова с ошибками ... – user3142695

+0

Могли бы вы использовать агрегирование манго? Я мог бы написать агрегацию для достижения этой цели в одной операции db. В противном случае простая функция diff на входе arr и результат arr из 'find' должны выполнять задание – Khang

+0

Я думаю, что не могу использовать скопления в meteor mongo (minimongo), но идея с использованием diff для результатов (без использования count), кажется, хорошо. Как получить единственный массив результатов? – user3142695