Можете ли вы подтвердить, что вы хотите иметь несколько коллекций, для которых у каждого пользователя есть своя база данных?Я думаю, что это не очень хорошее решение!
Это мое решение.Вы можете создать модель для каждого пользователя с той же схемой (userDBSchema
, которую вы создали).
Но вы должны быть уверены, что вы можете сгенерировать уникальные имена коллекций для каждого пользователя.(например, хэш-функция или что-то еще)
Я хочу еще раз подтвердить, что это не очень хороший способ при создании для каждого пользователя коллекции для хранения его информации.
Почему?
Если в вашей системе миллионы пользователей, у вас будут миллионы коллекций, управлять базой данных очень сложно.Лучше с миллионами документов в коллекции.Это моя личная мысль.Надеюсь помочь вам
const mongoose = require('mongoose');
const userDBSchema = require('path/to/your/schema/declared');
// Generating unique collection name for each user
const getCollectionNameForUser = (username) => username;
exports.saveUser = (req, res) => {
const username = req.params.user;
const UserInfoDb = mongoose.model(getCollectionNameForUser(username), userDBSchema);
const newUser = new UserInfoDb(req.body);
newUser.save((err, response) => {
//save operation
});
};
Edit - Simple demo
Это мое простое демонстрационное приложение, как создать динамическую модель со схемой в mongoose , вы можете просмотретьполный код и попробуйте его в вашей локальной базе данных здесь https://gist.github.com/huynhsamha/4dcf00a1fba96ae7f186b606b33b7e9c
В моей демонстрации я создал схему, хранящую информацию о пользователе
const Schema = mongoose.Schema;
const UserInfoSchema = new Schema({
note: String,
timeline: { type: Date, default: Date.now }
});
и добавьте log
(с note
)каждому пользователю через простой API GET
app.get('/add/:id/:note', async (req, res) => {
const { id, note } = req.params;
// Retrieve model which contain info documents of user with id
const UserInfo = mongoose.model('User_' + id, UserInfoSchema);
const log = new UserInfo({ note });
await log.save();
res.send(log);
})
И это API для получения журналов пользователя
app.get('/:id', async (req, res) => {
const { id } = req.params;
// Retrieve model which contain info documents of user with id
const UserInfo = mongoose.model('User_' + id, UserInfoSchema);
const logs = await UserInfo.find();
res.send(logs);
})
Я проверил этот код, и он работает.Каждый пользователь имеет коллекцию для хранения своих данных.
Вы можете скачать и проверить ее на своем локальном компьютере с кодом gist https://gist.github.com/huynhsamha/4dcf00a1fba96ae7f186b606b33b7e9c.