最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How to select two table (document) value at a time by user id in mongoose? - Stack Overflow

programmeradmin2浏览0评论

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
Add a ment  | 

3 Answers 3

Reset to default 5

For 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);
});
发布评论

评论列表(0)

  1. 暂无评论