Как создать новый объект в коллекции с заполненным полем - PullRequest
0 голосов
/ 09 мая 2019

Я сейчас на школьном проекте.Я должен создать веб-сайт, и я хотел сделать приложение MEAN.Все было хорошо, пока я не хотел создавать хорошие модели для мангусты.У меня будут пользователи (name, psswd и т. Д.) В одной коллекции, а их «подробная информация» будет в другой коллекции.

Я знаю, как запрашивать, находить и собирать данные.Это все в документации mongoose, но ...

Я не знаю, как создать (при ответе на запрос POST) нового пользователя с его выделенной "подробной информацией".

Что такоеметод заполнения для:

~User.cardid.create()~ ?
~
var cardIDSchema = new mongoose.Schema({
  userID: String,
  name: String,
  surname: String,
  date_Of_Birth: Date,
  address: String,

var userSchema = new mongoose.Schema({
  email: String,
  psswd: String,
  cardID: { type: mongoose.Schema.Types.ObjectId, ref: 'CardID'}
});~

1 Ответ

0 голосов
/ 09 мая 2019

Если вы пришли из мира SQL , метод populate работает как оператор join, где он использует ссылочный столбец в одной таблице для извлечения соответствующих элементов для внешних таблиц. В приведенной выше схеме, если вы должны были получить использование и хотите получить сопровождающий detailed information, вы используете метод populate, например, User.findOne().populate('cardId');

Я изменил схему ниже, чтобы упростить ее.

Для создания нового пользователя с соответствующей подробной информацией по этой схеме:

var cardIDSchema = new mongoose.Schema({
  name: String,
  surname: String,
  date_Of_Birth: Date,
  address: String,
})

var Card = mongoose.model('Card', cardIDSchema);

var userSchema = new mongoose.Schema({
  email: String,
  psswd: String,
  cardID: { type: mongoose.Schema.Types.ObjectId, ref: 'CardID'}
});

const User = mongoose.model('user', userSchema);

Вы должны сначала создать информацию о карте, чтобы получить ObjectId, а затем пользователь.


//...
// Create the card first.
var card = new Card({
  name: 'Some',
  surname: 'Person',
  date_Of_Birth: Date.now(),
  address: 'Somewhere in the world'
}); // this will create a new card._id automatically

// Create the user and pass the card._id as the reference.
var user = new User({
  email: 'test@example.org',
  psswd: 'somesecret',
  cardID: card._id
});

/**
 * Depending on if you're using an async/await function...
 */
// For async...
// Save the card information first.
await card.save();

// Then save the user information.
await user.save();


// For callbacks...
card.save(function (err) {
    if (err) ; // Do something with error.

    user.save(function (err) {
        if (err) ; // Do something with the error.
});

//...

Получить модель еще проще, поэтому был создан метод populate.


//...

// Say the id of the user you created was '5cd47029324acd59fc666df6'
// Using the async/await function...
var user = await User.findById('5cd47029324acd59fc666df6').populate('cardID');

// Using callback...
User.findById('5cd47029324acd59fc666df6')
    .populate('cardID')
    .exec(function (err, user) {
        if (err) ; // Do something with error.

        // Continue with user here...
    });

// The user variable will then be...
/**
 * {
 *    _id: '5cd47029324acd59fc666df6',
 *    email: 'test@example.org',
 *    psswd: 'somesecret',
 *    cardID: {
 *        _id: '5cd47652324acd59fc666df7',
 *        name: 'Some',
 *        surname: 'Person',
 *        date_Of_Birth: Date.now(),
 *        address: 'Somewhere in the world'
 *    }
 * }
 */

//...

PS : Для обеспечения согласованности используйте модуль fawn npm, который имитирует своего рода транзакционное состояние, чтобы гарантировать, что все данные сохраняются перед продолжением, и если одна из моделей не сохраняется, первоначально сохраненная модель будет удалена из базы данных.

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