Выполнение запроса Mongodb занимает слишком много времени - PullRequest
0 голосов
/ 01 октября 2018

Я работаю над проектом Go и использую mongodb для хранения своих данных.Но неожиданно выполнение запроса mongodb заняло слишком много времени для получения данных.У меня есть коллекция под названием «автомобили» с около 25000 документов и каждый документ, содержащий около 200 полей (4,385 КБ).У меня есть сводный запрос, подобный следующему:

db.cars.aggregate([
    {
        $lookup:
        {
            from: "users",
            localField: "uid",
            foreignField: "_id",
            as: "customer_info"
        }
    },{
        $unwind: "$customer_info"
    },{
        $lookup:
        {
            from: "user_addresses",
            localField: "uid",
            foreignField: "_id",
            as: "address"
        }
    },{
        $unwind: "$address"
    },{
    $lookup:
        {
            from: "models",
            localField: "_id",
            foreignField: "car_id",
            as: "model_info"
        }
    },{
    $match:{
        purchased_on:{$gt:1538392491}, 
        status:{$in:[1,2,3,4]}, 
        "customer_info.status":{$ne:9}, 
        "model_info.status":{$ne:9},
        }
    },{
        $sort:{
            arrival_time:1
        }
    },{
        $skip:0
    },{
        $limit:5
    }
])

Моя структура документа выглядит следующим образом: https://drive.google.com/file/d/1hM-lPwvE45_213rQDYaYuYYbt3LRTgF0/view.

Теперь, если выполнить этот запрос без индексации, то для загрузки файла потребуется около 10 минут.данные.Кто-нибудь может подсказать, как мне сократить время его выполнения?

1 Ответ

0 голосов
/ 02 октября 2018

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

  • Как сказал в комментариях Энтони Винзлет, используйте как можно более позднюю стадию $ match в качестве первой.Таким образом, вы можете сократить количество документов, переданных на следующие этапы, и использовать индексы.

  • Предполагая, что вы используете не менее 3,6 монго-версии, измените этапы поиска с помощью команды let / pipe.'синтаксис ( см. здесь ).Таким образом, вы можете интегрировать ваши «внешние фильтры» («customer_info.status»: {$ ne: 9}, «model_info.status»: {$ ne: 9}) на этапе $ match в конвейере поиска.С индексами на правильных полях / коллекциях вы получите некоторое время / память на этапах поиска в $.

  • Выполните этапы раскрутки как можно позже, чтобы ограничить количество документов, передаваемых вследующие этапы.

Важно понимать, как работает конвейер агрегации: каждый этап получает данные, делает свое дело и передает данные на следующий этап.Таким образом, чем меньше данных передается в конвейер, тем быстрее будет ваш запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...