MondoDB / Mon goose слишком медленный ответ на запрос - PullRequest
2 голосов
/ 13 марта 2020

Я новичок в MongoDB / Mon goose и работаю с очень большой базой данных (более 25000 документов). Мне нужно настроить разные запросы: по полям, первые 10 документов, один по идентификатору. Проблема с производительностью - отклик сервера слишком медленный (около 10-15 секунд). Подскажите пожалуйста, как настроить это так, чтобы ответ сервера был быстрым? Зависит ли он только от настроек схемы или может зависеть от других вещей, таких как параметры подключения к базе данных или параметры запроса? PS Запросы должны быть «район» и «местность». Спасибо за любую помощь!

Вот схема:

const mongoose = require('mongoose');

const Schema = mongoose.Schema;

const houseSchema = new Schema({
  code: {
    type: String,
    required: false
  },
  name: {
    type: String,
    required: true
  },
  district: {
    type: String,
    required: true
  },
  locality: {
    type: String,
    required: false
  },
  recountDate: {
    type: Date,
    default: Date.now
  },
  eventDate: {
    type: Date,
    default: Date.now
  },
  events: {
    type: Array,
    default: []
  }
});

module.exports = mongoose.model('House', houseSchema);

Параметры подключения:

mongoose.connect(
  `mongodb+srv://${process.env.MONGO_USER}:${process.env.MONGO_PASSWORD}@cluster0-vuauc.mongodb.net/${process.env.MONGO_DB}?retryWrites=true&w=majority`,
  {
    useNewUrlParser: true,
    useUnifiedTopology: true
  }
).then(() => {
  console.log('Connection to database established...')
  app.listen(5555);
}).catch(err => {
  console.log(err);
});

Запросы выполняются с использованием реле:

query {
  viewer {
    allPosts (first: 10) {
      edges {
        node {
          id
          code
          district
          locality
          recountDate
          eventDate
          events
        }
      }
    }
  }
}

Ответы [ 3 ]

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

MongoDB очень быстро выполняет запросы. Но это также зависит от того, как вы пишете свой запрос. Для получения первых 10 документов и сортировки их в порядке убывания по _id из коллекции. Вам нужно использовать limit & sort в вашем запросе.

db.collectionName.find({}).limit(10).sort({_id:-1})
1 голос
/ 13 марта 2020

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

Например, если в вашем запросе к коллекции постов вам нужны только поля меток времени, заголовка, автора и аннотации, вы должны выполнить следующую команду:

db.posts.find( {}, { timestamp : 1 , title : 1 , author : 1 , abstract : 1} ).sort( { timestamp : -1 } ).limit(10)

Вы можете прочитать для оптимизации запросов здесь

1 голос
/ 13 марта 2020

Убедитесь, что это не проблема подключения. Попробуйте выполнить запрос из оболочки MongoDB

mongo mongodb+srv://${process.env.MONGO_USER}:${process.env.MONGO_PASSWORD}@cluster0-vuauc.mongodb.net/${process.env.MONGO_DB}?retryWrites=true&w=majority
db.collection.find({condition}).limit(10)

Если в оболочке MongoDB он отвечает быстрее , чем понедельник goose:

Существует проблема для Node.js драйвер, использующий чистый Javascript сериализатор BSON , который очень медленно сериализуется из BSON в JSON.

Попробуйте установить bson-ext

Модуль bson-ext является альтернативным парсером BSON, который написан на C++. Он обеспечивает лучшую производительность десериализации и аналогичную или несколько лучшую производительность сериализации с чистым синтаксическим анализатором javascript.

https://mongodb.github.io/node-mongodb-native/3.5/installation-guide/installation-guide/#bson -ext-module

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