MongoDB - поиск идет медленно с подключенными коллекциями - PullRequest
0 голосов
/ 11 октября 2019

У меня есть несколько коллекций в моей базе данных MongoDB.

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

Вот рассматриваемая коллекция:

var mongoose = require("mongoose");

var visitSchema = new mongoose.Schema({
    Study: {type: mongoose.Schema.Types.ObjectId, ref: "study"},
    Site:  {type: mongoose.Schema.Types.ObjectId, ref: "site"},
    Subject: {type: mongoose.Schema.Types.ObjectId, ref: "subject"},
    Phase: {type: mongoose.Schema.Types.ObjectId, ref: "phase"},
    Visit_date: Date
},{ strict: false });


module.exports = mongoose.model("visit", visitSchema);

Маршрут, выполняющий поиск

router.get("/visit/subject/:id", middleware.isLoggedin, function(req,res){
    visit.find({ Subject: req.params.id }).populate("Study").populate("Site").populate("Phase").populate("Subject").sort('Visit_date').exec(function(err,returnedvisits){
        var returnedsubjects = [];
        if(err){
            console.log(err);
        } else {
            console.log(returnedvisits);
            res.render("visit", {returnedvisits: returnedvisits, returnedsubjects: returnedsubjects});
        }
    });
});

, возвращает только 2 записи, но получает связанные данные из других коллекций:

[ { _id: 5d9e1bdec73b3c34c0b97bb9,
    Subject:
     { _id: 5d8e42f200c09107744bd8c0,
       Subject_Name: 'Virat Kohli',
       Subject_DOB: 1979-10-24T00:00:00.000Z,
       Subject_Address: '14 Coakwell drive',
       Subject_City: 'Toronto',
       Subject_Prov: 'ON',
       Subject_zip: 'L6B 0L7',
       Subject_Country: 'Canada',
       __v: 0 },
    Study:
     { _id: 5d9e1bc3c73b3c34c0b97bb8,
       Study_short_name: 'CCR',
       Study_name: 'Cancel Cell Research',
       __v: 0 },
    Site:
     { _id: 5d9635a6e5ede964f4394447,
       Site_short_name: 'MCR',
       Site_name: 'Microsoft',
       __v: 0 },
    Phase:
     { _id: 5d93bd727d0a484b04317b68,
       Phase_number: 1,
       'Phase Description': 'Phase 1',
       __v: 0 },
    Visit_date: 2018-10-10T04:00:00.000Z,
    __v: 0 },
  { _id: 5d9e1bf6c73b3c34c0b97bba,
    Subject:
     { _id: 5d8e42f200c09107744bd8c0,
       Subject_Name: 'Virat Kohli',
       Subject_DOB: 1979-10-24T00:00:00.000Z,
       Subject_Address: '14 Coakwell drive',
       Subject_City: 'Toronto',
       Subject_Prov: 'ON',
       Subject_zip: 'L6B 0L7',
       Subject_Country: 'Canada',
       __v: 0 },
    Study:
     { _id: 5d9e1bc3c73b3c34c0b97bb8,
       Study_short_name: 'CCR',
       Study_name: 'Cancel Cell Research',
       __v: 0 },
    Site:
     { _id: 5d9635a6e5ede964f4394447,
       Site_short_name: 'MCR',
       Site_name: 'Microsoft',
       __v: 0 },
    Phase:
     { _id: 5d94abb5092b7333b472b0f6,
       Phase_number: 2,
       'Phase Description': 'Phase 2',
       __v: 0 },
    Visit_date: 2019-11-11T05:00:00.000Z,
    __v: 0 } ]

Это должно быть так медленно? Я знаю, MongoDB не для отчетности. Но такой сложный запрос, как этот?

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 12 октября 2019

Поскольку у вас есть только 2 записи, оптимальным подходом было бы встроить документы исследования, площадки, темы и фазы в один и тот же основной документ. Вы не делаете столько копий.

Это также рекомендуется в документации MongoDB One-By-Many .

В качестве альтернативы, если число записей начинает увеличиваться, просто создайте индекс в каждой из коллекций(Субъект, этап, исследование, сайт) по этому идентификатору, и посмотрите, насколько улучшится ваша производительность. Это должно обеспечить хорошие преимущества.

1 голос
/ 12 октября 2019

Попробуйте изменить формат даты и времени на строковый или крошечный. Это может помочь с перфорированием. https://www.mongodb.com/blog/post/fast-datetimes-in-mongodb

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