Example 1: mongoose populate
Story.
findOne({ title: /casino royale/i }).
populate('author', 'name'). // only return the Persons name
exec(function (err, story) {
if (err) return handleError(err);
console.log('The author is %s', story.author.name);
// prints "The author is Ian Fleming"
console.log('The authors age is %s', story.author.age);
// prints "The authors age is null'
});
Example 2: mongoose populate()
// populates a single object
User.findById(id, function (err, user) {
const opts = [
{ path: 'company', match: { x: 1 }, select: 'name' },
{ path: 'notes', options: { limit: 10 }, model: 'override' }
];
User.populate(user, opts, function (err, user) {
console.log(user);
});
});
// populates an array of objects
User.find(match, function (err, users) {
const opts = [{ path: 'company', match: { x: 1 }, select: 'name' }];
const promise = User.populate(users, opts);
promise.then(console.log).end();
})
// imagine a Weapon model exists with two saved documents:
// { _id: 389, name: 'whip' }
// { _id: 8921, name: 'boomerang' }
// and this schema:
// new Schema({
// name: String,
// weapon: { type: ObjectId, ref: 'Weapon' }
// });
const user = { name: 'Indiana Jones', weapon: 389 };
Weapon.populate(user, { path: 'weapon', model: 'Weapon' }, function (err, user) {
console.log(user.weapon.name); // whip
})
// populate many plain objects
const users = [{ name: 'Indiana Jones', weapon: 389 }]
users.push({ name: 'Batman', weapon: 8921 })
Weapon.populate(users, { path: 'weapon' }, function (err, users) {
users.forEach(function (user) {
console.log('%s uses a %s', users.name, user.weapon.name)
// Indiana Jones uses a whip
// Batman uses a boomerang
});
});
// Note that we didn't need to specify the Weapon model because
// it is in the schema's ref
Example 3: how to use mongoose populate
{ _id: 59ab1c92ea84486fb4ba9f28, username: JD, posts: [ "59ab1b43ea84486fb4ba9ef0", "59ab1b43ea84486fb4ba9ef1" ]}
Example 4: mongoose populate
//EXAMPLE TWO
const mongoose = require('mongoose')
const shortid = require('shortid')
/**
* @description setup database connection
*/
mongoose
.connect('mongodb://localhost:27017/mongoose', {
useFindAndModify: false,
useUnifiedTopology: true,
useNewUrlParser: true
})
.then(() => console.log('Connected'))
.catch(() => console.log('Not Connected'))
/**
* @description course mongoose schema
*/
const CourseSchema = new mongoose.Schema(
{
userId: { type: mongoose.Types.ObjectId },
course: []
},
{ timestamps: true }
)
const Course = mongoose.model('Course', CourseSchema, 'Course')
/**
* @description user mongoose schema
*/
const UserSchema = new mongoose.Schema(
{
fullName: {
type: String,
trim: true,
required: true
},
courseId: {
type: String,
ref: 'Course',
default: shortid.generate
}
},
{ timestamps: true }
)
UserSchema.post('save', async function (doc, next) {
if (doc) {
await Course.create({ userId: doc._id })
next()
}
})
const User = mongoose.model('User', UserSchema, 'User')
/**
* @description register user account
*/
async function registerAccount() {
const userData = new User({ fullName: 'john doe' })
await userData.save()
console.log('register successfuly')
process.exit(0)
}
registerAccount()
/**
* @description buy video course
*/
async function buyCourse() {
const user = await User.findOne({ fullName: 'john doe' })
const course = await Course.updateOne(
{ userId: user._id },
{
$push: {
course: {
$each: [
{ name: 'react for beginner', price: 95000 },
{ name: 'vue for beginner', price: 85000 },
{ name: 'angular for beginner', price: 75000 }
]
}
}
}
)
console.log('sucessfuly to buy course')
process.exit(0)
}
// buyCourse()
/**
* @description results all course after buy course
*/
async function resultsCourse() {
const user = await User.findOne({ fullName: 'john doe' })
const courseResult = await Course.findOne({ userId: user._id })
.populate({
path: 'userId',
select: 'course firstName lastName'
})
.lean()
console.log({
fullname: user.fullName,
courses: courseResult.course
})
process.exit(0)
}
// resultsCourse()