Проблема при отображении полей документов в MongoDB - PullRequest
1 голос
/ 04 марта 2020

Я новичок в программировании и стараюсь изо всех сил, но без посторонней помощи, я не думаю, что смогу его найти;) Я хочу показать все товары из mongoDB по брендам. У меня уже есть маршрут для категории, но в то же время, когда я пытаюсь реализовать ту же стратегию для брендов, у меня 404 не найдено. мой код:

router.get('/:categorySlug', (req, res, next) => {

let filter = {};
if(req.query.hasOwnProperty("filter")){
    filter['price'] = req.query.price
}

const slug = req.params.categorySlug;
Category.findOne({slug: slug})
.select('_id')
.exec()
.then(category => {
    if(category){
        if(category.parent === ""){
            Product.find({category: category._id})
            .select('_id name price productPic category brand slug')
            .sort(filter)
            .exec()
            .then(products => {
                res.status(200).json({
                    message: products
                })
            })
            .catch(error => {
                return res.status(404).json({
                    message: error
                })
            })
        }
    }else{
        return res.status(404).json({
            message: 'Not Found'
        })
    }
})
.catch(er => {
    res.status(500).json({
        error: er
    });
});



router.get('/:brandSlug', (req, res, next) => {

const slug = req.params.brandSlug;
Brand.findOne({slug: slug})
.select('_id parent')
.exec()
.then(brand => {
    if(brand){
            Product.find({brand: brand._id})
            .select('_id name price productPic brand slug')
            .exec()
            .then(products => {
                res.status(200).json({
                    message: products
                })
            })
            .catch(error => {
                return res.status(404).json({
                    message: error
                })
            })
    }else{
        return res.status(404).json({
            message: 'Not Found'
        })
    }
})
.catch(er => {
    res.status(500).json({
        error: er
    });
});

Категория, марка и схема продукта:

const brandSchema = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
name: { type: String, required: true },
slug: { type: String, required: true, unique: true },


const categorySchema = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
name: { type: String, required: true },
slug: { type: String, unique: true },


const productSchema = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
name: { type: String, required: true },
slug: { type: String, required: true, unique: true },
price: { type: Number, required: true },
oldPrice: { type: Number, default: 0 },
stock: { type: Number, required: true },
description: { type: String },
productPic: [
    {
        img: String
    }
],
keyword: {type: String},
category: { type: mongoose.Schema.Types.ObjectId, ref: 'Category', required: true  },
brand: { type: mongoose.Schema.Types.ObjectId, ref: 'Brand', required: true }

1 Ответ

0 голосов
/ 04 марта 2020

Вам не нужно делать два вызова БД, чтобы получить эти необходимые данные. Вместо этого вы можете объединить эти две коллекции и получить необходимые данные за один вызов БД (попробуйте прочитать о MongoDB"родном" $lookup или Пн goose * .populate() - что-то вроде оболочки для $lookup).

Но сейчас вы можете заменить это:

Product.find({brand: brand._id})

на:

Product.find({brand: mongoose.Types.ObjectId(brand._id)})

Фактическая проблема - brand._id - это строка в коде (Обычно, когда вы читать документы из коллекции brand в MongoDB, а затем регистрировать / распечатывать или даже использовать их в коде. Вы можете видеть ObjectId() преобразованные в строку как ObjectId() от BSON и не поддерживается JSON). Таким образом, вам нужно преобразовать входные данные (brand._id) из строки в ObjectId() перед отправкой запроса в коллекцию продуктов, поскольку поле бренда в коллекции продуктов имеет тип ObjectId() !!

Примечание: Не забудьте импортировать mon goose в этот файл, в противном случае эта точка не будет выполнена.

...