Если вы пришли из мира 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, который имитирует своего рода транзакционное состояние, чтобы гарантировать, что все данные сохраняются перед продолжением, и если одна из моделей не сохраняется, первоначально сохраненная модель будет удалена из базы данных.