如何在模型上使用到另一个模型

How to use on model into another model

我有两个独立的模型,名称为员工和用户,具有一些通用数据和一个 accountId,彼此 link。每个型号一条记录如下:

Employee
 _id:1639137618164

 name:"*****"
        
 sites:Array
 company:”Software”
 jobTitle: “Associate Software Engineer”
 email:"*****"
 phonesms:"1"
 phonevoice:"1"
 licenseNumber:""
 avatarStamp:0
 pined:false
 accountId: 1639129314021 //link attribute
 countryCodeSms:"US"
 countryCodeVoice:"US"
 inviteCode:"09611"
 emergencyRoles: Object
 invite: "booksRbUoSM"

用户是

_id:1639129314021

firstName:"*** ***"

lastName:"****"
companyName:"SITS"
passwordReset:""
activated:true
accountId:1639129314021 // link attribute
siteId:-1
    
role:0
    
last:1639137913873
blocked:false
blockedtext:""
trialend:1640338913781
paytype:1
hashAccess:Array
emergencyEnabled:false
visitorTypes:Array
sitesLimit:2
manualCreation:false
username:"*************"
    
password:"**********************************"
    
email:"*********************"
passwordNotification:true
passwordLifecycle:1646906375986
isNewUser:true
listFeature:Object

我想从用户模型中搜索该 accountId 是否存在任何员工,如果有员工与 accountId 关联,则添加具有可用公共数据的新员工。否则不会。我怎样才能在环回中做到这一点。我被困在这里了!

尝试以下

var  employee_data = Employee  .filter(x => User.map(y => y.accountId).includes(x.accountId));

我想你正在使用猫鼬并且你的 User 模型中有这部分:

accountId: {
  type: mongoose.Schema.ObjectId,
  ref: 'Employee',
  required: [true, 'this field must be provided']
},

您可以将 populate 方法添加到您的架构中,以便在您每次使用 User.find(), findOne, 和所有其他以 'find'[= 开头的方法请求数据时添加相关模型的数据18=]

userSchema.pre(/^find/, function(next) {
  this.populate({
    path: 'accountId',
    options: { // you can populate only some fields if you want
      select: 'name company jobTitle'
    }
  })

  next()
})

然后,您可以像往常一样使用您的 User 模型,但现在添加了相关的 Employee 数据:

const given_id = "65465458qw7d7q1q7w1x" 
const user = await User.findOne({accountId: given_id})

// Note: you can use User.find if there can be
// more than one user with that accountId.

环回 4

解决方案 1:

在您有权访问 UserRepository 的用户控制器中

假设您知道 accountId 并且仅当您有员工记录时accountId 才存在,您可以有一个方法

@get('/users/{accountId})
async findUserWhoIsAnEmployee(@param.path.string('accountId') accountId: string){
 return this.userRepository.findOne({where: {accountId}})
}

假设您不知道 accountId...

您可以访问 UserController 中的员工存储库,方法是将其作为构造函数中的参数传递并查找用户,然后签入员工记录。 (不是最优的,因为将在您的数据库上进行两次查询)

export class UserController{
  constructor(
     @repository(UserRepository) public userRepository: UserRepository,
     @repository(EmployeeRepository) private employeeRepository: EmployeeRepository
  )
  // returns employee record or null if none
  @get('/users/{id}/employee-record)
  async findUserWhoIsAnEmployee(@param.path.string('id') id: string){
   const user = await this.userRepository.findById(id);
   return (!user) ? null : this.employeeRepository.findOne({where: {accountId: user.accountId}})
  }
}

解决方案 2:

用户和员工模型之间存在关系(hasOne,最好是

您可以在该用户上找到该员工记录

// returns employee record of a user if exists 
@get('/users/{id})
async findUserWhoIsAnEmployee(@param.path.string('id') id: string){
 return this.userRepository.findById(id).employeeRecord()
}
//Where employeeRecord is a reference property on the user Model.

我正在使用环回版本 2.x.x。原来很简单

currentModel.app.models.modelYouWantToAccess