Как оптимизировать производительность с помощью запросов CREATE, PUT и DELETE в MongoDB? - PullRequest
1 голос
/ 30 мая 2020

У меня есть база данных с именем «reviews» размером 9,7 ГБ. Он имеет название коллекции products. Мне удалось оптимизировать запрос READ с использованием технической индексации, выполнив команду db.products.ensureIndex({product_name: 1}); Когда я запускаю следующую команду db.products.find({product_name:"nobis"}).explain("executionStats"); в терминале MongoDB, она показывает, что время выполнения сокращается с 28334 мс до 3301 мс.

У меня есть 2 следующих вопроса:

1) Как использовать explain("executionStats"); в запросах CREATE, PUT и DELETE? Для Например, я получил следующую ошибку [thread1] TypeError: db.products.insert(...).explain is not a function, когда попытался использовать следующую функцию вставки

db.products.insert({"product_id": 10000002,"product_name": "tissue","review": [{"review_id": 30000001,"user": {"user_id": 30000001,"firstname": "Peter","lastname": "Chen","gender": "Male","nickname": "Superman","email": "hongkongbboy@gmail.com","password": "123"},"opinion": "It's good","text": "It's bad","rating_overall": 3,"doesRecommended": true,"rating_size": "a size too big","rating_width": "Slightly wide","rating_comfort": "Uncomfortable","rating_quality": "What I expected","isHelpful": 23,"isNotHelpful": 17,"created_at": "2007-10-19T09:03:29.967Z","review_photo_path": [{"review_photo_id": 60000001,"review_photo_url": "https://sdcuserphotos.s3.us-west-1.amazonaws.com/741.jpg"}, {"review_photo_id": 60000002,"review_photo_url": "https://sdcuserphotos.s3.us-west-1.amazonaws.com/741.jpg"}]}, {"review_id": 30000002,"user": {"user_id": 30000002,"firstname": "Peter","lastname": "Chen","gender": "Male","nickname": "Superman","email": "hongkongbboy@gmail.com","password": "123"},"opinion": "It's good","text": "It's bad","rating_overall": 3,"doesRecommended": true,"rating_size": "a size too big","rating_width": "Slightly wide","rating_comfort": "Uncomfortable","rating_quality": "What I expected","isHelpful": 23,"isNotHelpful": 17,"created_at": "2007-10-19T09:03:29.967Z","review_photo_path": [{"review_photo_id": 60000003,"review_photo_url": "https://sdcuserphotos.s3.us-west-1.amazonaws.com/741.jpg"}]}]}).explain("executionStats");

2) Есть ли какой-либо метод оптимизации производительности, который я могу использовать для CREATE, PUT и DELETE запросов? Например, я могу использовать POSTMAN, чтобы получить время ответа на запрос DELETE, но время ответа занимает 38,73 секунды. enter image description here

const deleteReview = (request, response) => {
    const id = parseInt(request.params.id);
    Model.ProductModel.findOneAndDelete({ "review.review_id": id}, (error, results) => {
        if (error) {
            response.status(500).send(error);
        } else {
            response.status(200).send(results);
        }
    });
};

Это моя схема MongoDB:

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/reviews', { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true });
const Schema = mongoose.Schema;
const productSchema = new Schema({
    product_id: { type: Number, required: true, unique: true },
    product_name: { type: String, required: true, unique: true },
    review: [{
        review_id: { type: Number, required: true, unique: true },
        user: {
            user_id: { type: Number },
            firstname: { type: String },
            lastname: { type: String },
            gender: { type: String, enum: ['Male', 'Female', 'Other'] },
            nickname: { type: String },
            email: { type: String, required: true },
            password: { type: String, required: true },
        },
        opinion: { type: String, required: true },
        text: { type: String },
        rating_overall: { type: Number, min: 1, max: 5, required: true },
        doesRecommended: { type: Boolean, required: true },
        rating_size: { type: String, enum: ['a size too small', '1/2 a size too small', 'Perfect', '1/2 a size too big', 'a size too big'], required: true },
        rating_width: { type: String, enum: ['Too narrow', 'Slightly narrow', 'Perfect', 'Slightly wide', 'Too wide'], required: true },
        rating_comfort: { type: String, enum: ['Uncomfortable', 'Slightly uncomfortable', 'Ok', 'Comfortable', 'Perfect'], required: true },
        rating_quality: { type: String, enum: ['Poor', 'Below average', 'What I expected', 'Pretty great', 'Perfect'], required: true },
        isHelpful: { type: Number, required: true, default: 0 },
        isNotHelpful: { type: Number, required: true, default: 0 },
        created_at: { type: Date, required: true },
        review_photo_path: [{
            review_photo_id: { type: Number },
            review_photo_url: { type: String }
        }]
    }]
});
const ProductModel = mongoose.model('product', productSchema);
module.exports = { ProductModel };

1 Ответ

1 голос
/ 30 мая 2020

Если у вас его нет, убедитесь, что в вашей коллекции products указан индекс review.review_id. Вы используете это, чтобы найти, что удалить, чтобы это было проиндексировано.

Я прочитал вашу функцию deleteReview как удаление документа продукта, содержащего обзор, а не просто удаление отдельного обзора - это то, чего вы ожидаете?

Вы должны иметь возможность просто $pull обзор из массива отзывов, чтобы избавиться от него.


Вы можете использовать объяснение в обновлении следующим образом:

db.products.explain().update({...}, {...});

См .: https://docs.mongodb.com/manual/reference/method/db.collection.explain/

Вы можете объяснить:

  • aggregate ()
  • count ()
  • find ()
  • удалить ()
  • update ()
  • independent ()
  • findAndModify ()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...