Я учусь использовать mongoDB И ExpressJS путем создания Rest API, который я бы использовал с ReactJS.
Я всегда выбирал MySQL для управления моей базой данных, но база данных mongoDB не является реляционной, и мне все еще трудно понять.
Пример того, что я хочу сделать
Допустим, я создал блог и хотите получать все статьи от пользователя, вошедшего в систему с учетной записью.
Все эти операции управляются с помощью REST API и MongoDB.
Как создать отношения OneToMany между статьями и пользователь.
С MySQL мне просто нужно было указать ключ user_id для каждой статьи в таблице статей.
Но с mongoDB, как это создать, и особенно для пользователя, который вошел в систему с учетной записью, чтобы только зарегистрированный пользователь мог просматривать свои статьи.
РЕДАКТИРОВАТЬ
Я что-то пробовал, это работает, но я не знаю, это правильный подход.
Co ntext:
Я создал REST API с NodeJS и ExpressJS.
API позволит пользователю организовать свои приложения для облегчения поиска job.
Пользователь должен создать учетную запись и войти в систему, чтобы воспользоваться всеми функциями приложения, поэтому общедоступная информация отсутствует.
Для регистрации и аутентификации пользователя я использую Паспорт JS, mongoConnect и ExpressSession
Для начала, пользовательская модель mongoDB
const userSchema = mongoose.Schema({
name: {
type:String
},
email: {
type:String,
required:true,
unique:true
},
email_is_verified: {
type:Boolean,
default:false
},
password: {
type:String,
},
referral_code : {
type:String,
default: function() {
let hash = 0;
for(let i=0; i < this.email.length; i++){
hash = this.email.charCodeAt(i) + ((hash << 5) - hash);
}
let res = (hash & 0x00ffffff).toString(16).toUpperCase();
return "00000".substring(0, 6 - res.length) + res;
}
},
referred_by : {
type: String,
default:null
},
third_party_auth: [ThirdPartyProviderSchema],
date: {
type:Date,
default: Date.now
}
},
{ strict: false }
);
module.exports = mongoose.model('Users', userSchema);
Модель Apply представляет собой заявку на вакансию, пока только название.
Чтобы создать отношение OneToMany, я добавляю поле User, которое относится к моей модели User
Функция для получения всех применений, поэтому я получаю идентификатор пользователя сеанса.
const applySchema = mongoose.Schema({
title: { type:String, required:true },
user: {
type: mongoose.Schema.Types.ObjectId,
ref: "User"
}
})
module.exports = mongoose.model('Apply', applySchema);
Я создал контроллер для управления приложениями пользователя
exports.getAllApplies = (req, res, next) => {
res.locals.currentUser = req.user;
const userId = res.locals.currentUser.id
Apply.find({ user:userId })
.then(applies => res.status(200).json({ message:'success',
applies:applies }))
.catch(error => res.status(400).json({ error:error, message: 'Failed'}))
}
Функция, позволяющая обращаться к приложению
exports.getOneApply = (req, res, next) => {
res.locals.currentUser = req.user;
const userId = res.locals.currentUser.id
Apply.findOne({ _id:req.params.id, user:userId })
.then(apply => res.status(200).json({ message: `Apply with id
${apply._id} success`, apply:apply}))
.catch(error => res.status(500).json({ error:error, message:'Failed'}))
}
Маршруты моего api, я добавляю промежуточное ПО auth в разрешить запросы только y для пользователя с токеном
const express = require('express');
const router = express.Router();
const auth = require('../middleware/auth');
const applyCtrl = require('../controllers/apply');
router.get('/', auth, applyCtrl.getAllApplies);
router.get('/:id', auth, applyCtrl.getOneApply);
module.exports = router;
Прошу прощения за длину поста, если у вас есть вопросы, буду рад на них ответить.
Заранее благодарю за ваша помощь и ваши ответы.