I am using NodeJs, ExpressJs with Mongodb and Mongoose. I want to select two document's value by user id.
I have three model User, Academic and Career. I have made a relation with Academic and Career schema by _id of User schema. I have saved some values in these documents. Now i want to select academic and career's document value by user id.
Model
// user model
const userSchema = new mongoose.Schema({
name: {type: String},
email: {type: String},
});
const user = mongoose.model('User', userSchema);
// academic model
const academicSchema = new mongoose.Schema({
academicLevel: {type: String},
passYear: {type: Number},
user: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
}
});
const academic = mongoose.model('Academic', academicSchema);
// career model
const careerSchema = new mongoose.Schema({
jobTitle: {type: String},
pany: {type: String},
user: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
}
});
const career = mongoose.model('Career', careerSchema);
documents
// user documents
_id: objectId("5d0df6a4134d4d295ca9f212")
name: "John Doe"
email: "[email protected]"
_id: objectId("5d0e70a6c87ca528c0a79a0f")
name: "Mark Boucher"
email: "[email protected]"
// academic documents
_id: objectId("5d60bc7188a8ef3648b8e8cf")
academicLevel: "Master"
passYear: "2018"
user: objectId("5d0e70a6c87ca528c0a79a0f")
_id: objectId("5d60d56f0cf9af32901cb2aa")
academicLevel: "Bachelor"
passYear: "2016"
user: objectId("5d0e70a6c87ca528c0a79a0f")
// career documents
_id: objectId("5d60bc1d88a8ef3648b8e8ce")
jobTitle: "Software Engineer"
pany: "Daffodil Software Ltd."
user: objectId("5d0e70a6c87ca528c0a79a0f")
nodejs
router.get('/getInfoById', async (req, res) => {
const user = await User
.find(req.query.id)
.select()
res.send(user);
})
How to get values from two documents (academic and career) by user id. Thanks.
I am using NodeJs, ExpressJs with Mongodb and Mongoose. I want to select two document's value by user id.
I have three model User, Academic and Career. I have made a relation with Academic and Career schema by _id of User schema. I have saved some values in these documents. Now i want to select academic and career's document value by user id.
Model
// user model
const userSchema = new mongoose.Schema({
name: {type: String},
email: {type: String},
});
const user = mongoose.model('User', userSchema);
// academic model
const academicSchema = new mongoose.Schema({
academicLevel: {type: String},
passYear: {type: Number},
user: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
}
});
const academic = mongoose.model('Academic', academicSchema);
// career model
const careerSchema = new mongoose.Schema({
jobTitle: {type: String},
pany: {type: String},
user: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
}
});
const career = mongoose.model('Career', careerSchema);
documents
// user documents
_id: objectId("5d0df6a4134d4d295ca9f212")
name: "John Doe"
email: "[email protected]"
_id: objectId("5d0e70a6c87ca528c0a79a0f")
name: "Mark Boucher"
email: "[email protected]"
// academic documents
_id: objectId("5d60bc7188a8ef3648b8e8cf")
academicLevel: "Master"
passYear: "2018"
user: objectId("5d0e70a6c87ca528c0a79a0f")
_id: objectId("5d60d56f0cf9af32901cb2aa")
academicLevel: "Bachelor"
passYear: "2016"
user: objectId("5d0e70a6c87ca528c0a79a0f")
// career documents
_id: objectId("5d60bc1d88a8ef3648b8e8ce")
jobTitle: "Software Engineer"
pany: "Daffodil Software Ltd."
user: objectId("5d0e70a6c87ca528c0a79a0f")
nodejs
router.get('/getInfoById', async (req, res) => {
const user = await User
.find(req.query.id)
.select()
res.send(user);
})
How to get values from two documents (academic and career) by user id. Thanks.
Share edited Sep 7, 2019 at 13:07 Tony 20.2k7 gold badges41 silver badges62 bronze badges asked Sep 7, 2019 at 12:53 Monir TuhinMonir Tuhin 1172 silver badges12 bronze badges 5- Do you want two different queries or want single query to get the solution ? – Pushprajsinh Chudasama Commented Sep 7, 2019 at 12:59
- i want single query – Monir Tuhin Commented Sep 7, 2019 at 13:02
- Which version MongoDB are you use ? Do you need aggregation query ? – Ashok Commented Sep 7, 2019 at 13:03
- version: 4.0.9. I don't know about aggregation query. I am new in Mongodb and mongoose – Monir Tuhin Commented Sep 7, 2019 at 13:07
- i think best practice is using 2 queries, as suggested in an answer. – yaya Commented Sep 7, 2019 at 13:14
3 Answers
Reset to default 5For what I've read in the docs, I think what you are looking for is something like so:
const career = await Career.find({ user: user._id});
const academics = await Academics.find({ user: user._id});
Or if you want to execute both queries at the same time:
const careerOperation = Career.find({ user: user._id});
const academicsOperation = Academics.find({ user: user._id});
const [
career,
academics
] = await Promise.all([career.exec(), academics.exec()]);
Hope to have helped!
Since Mongoose
is used here: This can achieved using Populate. populate
is pretty similar/analogues to what you would achieve via $lookup aggregation in pure mongo.
An alternative option: If you would adjust your schemas like this to really leverage Mongoose
.
//user model
const userSchema = new mongoose.Schema({
name: { type: String },
email: { type: String },
career: {
type: Schema.Types.ObjectId,
ref: "Career"
},
academic: {
type: Schema.Types.ObjectId,
ref: "Academic"
}
});
//academics and career can be array of documents as well -if required
const user = mongoose.model("User", userSchema);
// academic model
const academicSchema = new mongoose.Schema({
academicLevel: { type: String },
passYear: { type: Number }
});
const academic = mongoose.model("Academic", academicSchema);
// career model
const careerSchema = new mongoose.Schema({
jobTitle: { type: String },
pany: { type: String }
});
const career = mongoose.model("Career", careerSchema);
Populate query: To get user's academics and career docs
const user = await User.find({ _id: requestedUserId })
.populate("academic")
.populate("career")
.exec();
NOTE: requestedUserId
is the user id that to be filtered upon.
This is the simplest query we can make for find user with given query Id
router.get('/getInfoById/:id', async (req, res) => {
const user = await User.aggregate([
{ $match: { _id: mongoose.Types.ObjectId(req.query.id) }},
{ $lookup: {
from: "career",
localField: "_id",
foreignField: "user",
as: "careers"
}},
{ $lookup: {
from: "academic",
localField: "_id",
foreignField: "user",
as: "academics"
}}
])
res.send(user);
});