partyzanx
@partyzanx

Как ускорить процесс извлечения из БД?

Делаю словарь. Пользователь делает запрос, допустим, 200 иероглифов.

Запрос происходит так

app.get('/search', async (req, res) => {  
searchingBy = '美术设计师美术设计师美术设计师美术设计师美术设计师美术设计师美术设计师美术设计师美术设计师美术设计师美术设计师美术设计师美术设计师美术设计师美术设计师美术设计师美术设计师美术设计师美术设计师美术设计师'
 searchingBy = searchingBy.split('');
...
    let arr = []; 
    for (let i of searchingBy) {
        let e = await Word.find({characters: i});
        arr = arr.concat(e)
    }
...


Получается сайт долго грузится, потому что много итераций.
Как сделать так, чтобы итерации происходили параллельно друг другу?
Научите, пожалуйста. Я новичок в этом деле.
Я так понял надо как-то на промисах что ли...

Весь файл вот
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const compression = require('compression'); 
const cookieParser = require('cookie-parser');
const mongoose = require('mongoose'); 
const helmet = require('helmet'); 
const path = require('path'); 
const db = mongoose.connection;
const keys = require('./keys/index');
const variables = require('./middlewares/variables');
const Word = require('./models/word'); 
  
 

app.set("view engine", "pug");
app.use(cookieParser())
app.use(bodyParser.urlencoded({ extended: true }));
app.use('/public', express.static(path.join(__dirname, 'public')));
app.use(helmet());
app.use(compression());

app.use(variables);
 
app.get('/', (req, res) => {   
    let lang = req.cookies.lang;
    res.render('index', {
        pageTitle: 'mainPage',
        lang
    });
}); 

 

app.get('/search', async (req, res) => {  
    let lang = req.cookies.lang;
    let {query: {q: searchingBy }} = req; 

 
    searchingBy = searchingBy.split('');
 
    let arr = []; 
    for (let i of searchingBy) {
        let e = await Word.find({characters: i});
        arr = arr.concat(e)
    }
    searchingBy = arr; 
    res.render('search', { 
        pageTitle: 'Search',
        searchingBy,
        lang
    });
}); 


const PORT = process.env.PORT || 1000;

async function start() {

    try {
    await mongoose.connect(keys.MONGODB_URI, {useUnifiedTopology: true, useNewUrlParser: true, useCreateIndex: true, useFindAndModify: false});  
     
    app.listen(PORT, () => {
        console.log(`Listen to ${PORT}`)
    })
    } catch(e) {
        console.log(e)
    }

} 

start();
  • Вопрос задан
  • 93 просмотра
Решения вопроса 1
hzzzzl
@hzzzzl
await Word.find({characters: i});
то есть там Word.characters это один символ, или массив?

посмотри на оператор $in монгидб
https://docs.mongodb.com/manual/reference/operator...

await Word.find({ 
  characters: { 
    $in: [...searchingBy]   // когда characters есть в массиве searchingBy
  } 
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Kozack
@Kozack
Thinking about a11y
// Паралельный поиск, но в одном потоке
let arr = await Promise.all( searchingBy.split('').map(i => Word.find({characters: i}) ) )

Но, лучше всего переделать Word.find, чтобы он искал по нескольким символам сразу
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы