Mongoose:只查找并选择虚拟

mzsu5hc0  于 2023-03-03  发布在  Go
关注(0)|答案(3)|浏览(122)

我在mongoose中有一个UserSchema模式:

var UserSchema = new Schema({
  name: String,
  username: String,
  email: String,
  role: {type: String, default: 'user'},
  following: [{type: Schema.ObjectId, ref: 'User'}],
  followers: [{type: Schema.ObjectId, ref: 'User'}],
  hashedPassword: String,
  provider: String,
  salt: String,
  facebook: {},
  twitter: {},
  github: {},
  google: {}
});

我创建了一个虚拟的profile,它只返回公共配置文件的信息:

UserSchema
  .virtual('profile')
  .get(function() {
    return {
      'username': this.username,
      'name': this.name,
      'role': this.role
    };
  });

我的问题是如何在发出find请求时只获得这些信息。

UserSchema.statics = {
  list: function (options, callback) {
    var criteria = options.criteria || {};

    this.find(criteria)
      .select(/* What to put here? */)
      .limit(options.perPage)
      .skip(options.perPage * options.page)
      .exec(callback);
  } 
};

当然,我可以简单地写上usernamenamerole,但是那样的话,代码会重复,我能避免吗?

jslywgbw

jslywgbw1#

根据蒙古杰的文件
只有非虚拟属性才能用作查询的一部分和用于字段选择。
你可以这样做

exports.show = function (req, res, next) {
  var userId = req.params.id;

  User.findById(userId, function (err, user) {
    if (err) {
      return next(err);
    }
    res.json(user.profile);
  });
};

但不是这个

exports.devs = function (req, res, next) {
  User.find({role: 'developer'}, 'developer_profile', function (err, users) {
  if (err) {
    return res.status(500).send(err);
  }
  res.status(200).json(users);
  });
};

您可以在此处阅读更多信息http://mongoosejs.com/docs/guide.html#virtuals

daolsyd0

daolsyd02#

在填充Try it中:

UserSchema.virtual('profile', {
  ref: 'Job',
  localField: 'job_id',
  foreignField: '_id',
  justOne: true,
  options: {
    select: 'name type'
  }
});
jtw3ybtb

jtw3ybtb3#

除了这个find之外,您是否还在使用虚拟profile?您的虚拟实际上只是指定了一些字段,没有什么更动态的,因此,如果您只是尝试在查询中选择字段,我将坚持使用它(.select('username name role')).如果你想让它可重用...只要把字符串变成一个可以通过require注入的模块中的值。然后你可以在任何需要的地方修改它,并像select(profileFields)那样使用它。

相关问题