как вернуть один объект объединить с двумя моделями mon goose - PullRequest
0 голосов
/ 27 марта 2020

У меня есть две модели mon goose:

  1. модель пользователя
  2. любимая модель бизнеса

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

Любимая модель:

const mongoose = require("mongoose");
const favouriteSchema = mongoose.Schema({
 _id: mongoose.Schema.Types.ObjectId,
 userId: {
   type: mongoose.Schema.Types.ObjectId,
   require: true,
   ref: "userModel"
 },
 businessId: {
   type: mongoose.Schema.Types.ObjectId,
   require: true,
   ref: "businessModel"
 },
 favouriteStatus: { type: Boolean, require: true, default: false }
 });

module.exports = mongoose.model("favouriteModel", favouriteSchema);

Модель пользователя:

const mongoose = require("mongoose");
const userSchema = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
phone: {
   type: Number,
   required: true,
   unique: true
   //match: /^((\+92)|(0092))-{0,1}\d{3}-{0,1}\d{7}$|^\d{11}$|^\d{4}-\d{7}$/
 },
 profileImage: { type: String, required: true },
 firstName: { type: String, required: true },
 lastName: { type: String, required: true },
 password: { type: String, required: true }
});

module.exports = mongoose.model("UserModel", userSchema);

Контроллер входа пользователя:

router.post('/login', UserValidation.loginUser, (req, res, next) => {
    //express validation
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
        return res.status(422).json({ errors: errors.array() });
    }

    UserModel.findOne({ phone: req.body.phone })
        .select()
        .exec()
        .then(user => {
            console.log({ userdata: user });
            if (user === null) {
                return res.status(401).json({
                    success: false,
                    message: 'phone not exits',
                });
            }
            //password convert to hast and then match
            bcrypt.compare(req.body.password, user.password, (err, result) => {
                if (err) {
                    return res.status(401).json({
                        success: false,
                        message: err,
                    });
                }
                if (result) {
                    const token = jwt.sign(
                        {
                            phone: user.phone,
                            userId: user._id,
                        },
                        process.env.JWT_KEY,
                        {
                            expiresIn: '1h',
                        }
                    );
                    // find favorite of this user
                    favouriteModels
                        .find({ userId: user._id })
                        .select('favouriteStatus')
                        .then(userWithFavorite => {
                            if (userWithFavorite.length > 0) {
                                return res.status(200).json({
                                    success: true,
                                    message: 'AUTH SUCCESS',
                                    token: token,
                                    data: { user, userWithFavorite },
                                });
                            } else {
                                console.log({ _id: user._id });
                                return res.status(200).json({
                                    success: true,
                                    message: 'AUTH SUCCESS',
                                    token: token,
                                    data: { user },
                                });
                            }
                        })
                        .catch(err => {
                            res.status(500).json({
                                status: 500,
                                success: false,
                                message: err,
                            });
                        });
                } else {
                    return res.status(401).json({
                        success: false,
                        message: 'password is incorrect',
                    });
                }
            });
        })
        .catch(() => {
            res.status(500).json({
                success: 500,
                success: false,
            });
        });
});

1 Ответ

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

Когда вам нужен доступ к ссылочной схеме, вы можете использовать populate, поэтому в вашем случае:

favouriteModels
    .find({ userId: user._id })
    .populate("userModel")
    .exec()
    .then(user => { 
        res.status(200).json(user); // access "userSchema" with user.userSchema
    });

Подробнее об этом см. В документации mon goose .

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