Mongo - Как передать имя коллекции в схему при сохранении данных - PullRequest
0 голосов
/ 19 декабря 2018

У меня кончено здесь мангуст, и я не знаю, где я ошибаюсь.Пожалуйста, помогите мне.

Скажите, что я определил мою схему, как показано ниже:

const userDBSchema = new Schema({
    userName: {
        type:String
    },
    musicType: {
        type: String,
    },
}, { collection: 'userData' });

, затем запустил сообщение в базу данных, используя эту функцию:

exports.saveUser = (req, res) => {
    const username = req.params.user;

    const newUser = new UserInfoDb(req.body, {'collection': username});
    newUser.save((err, response) => {
      //save operation
    });
};

я получаю эту ошибку:

{
    "message": "document must have an _id before saving",
    "name": "MongooseError"
}

Даже когда я вручную определяю идентификатор, со следующей схемой:

    _id: {
        type: mongoose.Schema.Types.ObjectId,
        index: true,
        required: true,
        auto: true
    },

Я получаю эту ошибку:

{
    "errors": {
        "_id": {
            "message": "Path `_id` is required.",
            "name": "ValidatorError",
            "properties": {
                "message": "Path `_id` is required.",
                "type": "required",
                "path": "_id"
            },
            "kind": "required",
            "path": "_id"
        }
    },
    "_message": "userDB validation failed",
    "message": "userDB validation failed: _id: Path `_id` is required.",
    "name": "ValidationError"
}

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

1 Ответ

0 голосов
/ 19 декабря 2018

Можете ли вы подтвердить, что вы хотите иметь несколько коллекций, для которых у каждого пользователя есть своя база данных?Я думаю, что это не очень хорошее решение!

Это мое решение.Вы можете создать модель для каждого пользователя с той же схемой (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 }
});

и добавьте lognote)каждому пользователю через простой 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.

...