从不同的 collection 获取数据,在 mongoose 中没有任何关系

Get Data from the different collection without any relation in mongoose

从不同的 collection 获取数据,与 mongoose

没有任何关系

Collection 架构

mongoose.Schema({
    skillid:{type:Number},
    name:{type:String},
});

技能Collection

mongoose.Schema({
  userid: {type: mongoose.Types.ObjectId},
  OverView:{type:String},
  location:{type:String},
  skills:[{Type:Number}] 
});
 { 
_id: 5f48d5d1b98bffee67b49917
 skillid: 1
 name: 'HTML' 
}

{ 
_id: 5f48d612b98bffee67b49919
skillid: 2
 name: 'PHP' 
}


User Collection

{
  _id: 5f425bdb311b791670d60de6,
  userid: 5f41115fbd904134883ae2d8,
  OverView: 'sdsdssdsd',
  skills: [1,2],   // skill id
  Education: [ 5f453e7f53895727f0e39d82, 5f453fb963d4ab181c115982 ],
  location: 'India',
}

如何从技能 Collection - mongoose

中获取技能名称

我想要这样的结果

 { 
  _id: 5f425bdb311b791670d60de6, 
   userid: 5f41115fbd904134883ae2d8, 
   OverView: 'sdsdssdsd', 
   skills: ['HTML','PHP'], // skill id
   Education: [ 5f453e7f53895727f0e39d82, 5f453fb963d4ab181c115982 ],
   location: 'India'
 } ```

您可以使用 aggregate(),

db.user.aggregate([
  {
    $lookup: {
      from: "skill",
      localField: "skills",
      foreignField: "skillid",
      as: "skills"
    }
  },
  {
    $addFields: {
      skills: {
        $reduce: {
          input: "$skills",
          initialValue: [],
          in: {
            $concatArrays: [["$$this.name"], "$$value"]
          }
        }
      }
    }
  }
])

Playground


您可以使用猫鼬的另一个选项Virtual and also look at this

// SKILL SCHEMA
const SkillSchema = mongoose.Schema({
    skillid:{type:Number},
    name:{type:String},
});

// USER SCHEMA
const UserSchema = mongoose.Schema({
  userid: {type: mongoose.Types.ObjectId},
  OverView:{type:String},
  location:{type:String},
  skills:[{Type:Number}] 
});

// CREATES VIRTUAL CONNECTION WITH SKILL COLLECTION
UserSchema.virtual('skills', {
  ref: 'Skill', // The model to use
  localField: 'skills', // Find people where `localField`
  foreignField: 'skillid', // is equal to `foreignField`
  // If `justOne` is true, 'members' will be a single doc as opposed to
  // an array. `justOne` is false by default.
  justOne: false,
  // you can use other options
  // options: { sort: { name: -1 }, limit: 5 } 
});

// CREATE MODELS
const User = mongoose.model('User', UserSchema);
const Skill = mongoose.model('Skill', SkillSchema);

// QUERY TO FIND USERS AND POPULATE SKILLS
User.find({}).populate('skills').exec(function(error, user) {
  console.log(user);
});

Note: please refer documentation, if you are getting any problem, This is not tested code!