Сохраняет ли запрос определенных полей только время запроса в mongodb? - PullRequest
2 голосов
/ 14 марта 2020

Сохраняет ли запрос только определенных полей Сохраняет ли время запроса в запросе mongodb?

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

const CommentSchema = new mongoose.Schema({
    commentText:{
        type:String,
        required: true
    },
    arrayOfReplies: [{  
        replyText:{
            type:String,
            required: true
        },
        likes: [{
            objectIdOfUser: {
                type: mongoose.Schema.Types.ObjectId,
                ref: 'User',
                required: true,
            },
        }],
    }],
});

Я пытаюсь найти out, если mongodb запрашивает весь документ, затем фильтрует его, или если фильтрация происходит внутри mongodb.

Если у меня большой массив arrayOfReplies, например, 500 000 ответов. Будет ли приведенный ниже запрос, , как показано в понедельник goose docs , сэкономить время запроса по сравнению с запросом всего документа?

Comment.findById(id, 'commentText', function (err, comment) {});

РЕДАКТИРОВАТЬ

Я ранее спрашивал об этом (см. Ниже). Я изменил свой вопрос, чтобы отразить то, что я действительно хотел спросить. Хотя ответ на вопрос с помощью приведенного ниже запроса все еще существует.

Comment.findById(id, 'replyText', function (err, comment) {});

1 Ответ

2 голосов
/ 14 марта 2020

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

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

Mongod извлечет весь документ с диска в кеш, а затем скопирует необходимые данные из кеша в ответ .

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

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

...