猫鼬将属性合并为一个复合属性

时间:2019-06-01 07:04:33

标签: node.js mongoose node-modules

我正在开发Web应用程序。 后端部分是使用Mongoose用NodeJS编写的。

我有一个简单的用户模式:

const UsersSchema = new Schema({
  login: {
    type: String,
    required: true,
    lowercase: true,
    trim: true,
    unique: true
  },
  password: {
    type: String,
    required: true,
    trim: true
  },
  email: {
    type: String,
    required: true,
    trim: true
  },
  firstName: {
    type: String,
    required: true,
    trim: true
  },
  lastName: {
    type: String,
    required: true,
    trim: true
  }
});

我需要返回以添加fullName属性,而无需将其实际添加到数据库中。当然,我可以像这样this.firstName + " " + this.lastName进行连接。

但是我不知道是否有更好的方法来获得期望的行为。

我还使用mongoose-pagination-2库来支持项目的分页:

const users = await Users.paginate({}, queryParams);

请提供一些建议。 谢谢。

2 个答案:

答案 0 :(得分:0)

从数据库中获取数据后,您可以映射用户:

const users = await Users.paginate({}, queryParams);
users.docs = users.docs.map((user)=>{
    let fname=user.firstName!=null?user.firstName:'';
    let lname=user.lastName!=null?user.lastName:'';
    user.fullName= fname + " " + lname; 
    return user;
});

答案 1 :(得分:0)

您可以使用名为Virtuals的出色功能来获得所需的结果。

它可以完全满足您的需求。

对于您的情况,您需要执行几个步骤:

  1. 定义虚拟属性和get方法

    UsersSchema.virtual('fullName').get(function () {
       return this.firstName + " " + this.lastName;
    });
    
  2. 定义虚拟属性后,您将可以从模型中访问它。但是,当您执行查询时,它将丢失。此外,您正在使用分页库。要返回虚拟属性作为查询结果,我们需要按以下方式配置toObjecttoJSON方法:

    UsersSchema.set('toObject', { virtuals: true });
    UsersSchema.set('toJSON', { virtuals: true });
    

现在您可以查询文档,并且它也应该返回虚拟属性。