【问题标题】:Mongoose complex (async) virtualsMongoose 复杂(异步)虚拟
【发布时间】:2013-01-30 09:23:11
【问题描述】:

我有两个 mongoose 架构,如下所示:

var playerSchema = new mongoose.Schema({
    name: String,
    team_id: mongoose.Schema.Types.ObjectId
});
Players = mongoose.model('Players', playerSchema);

var teamSchema = new mongoose.Schema({
    name: String
});
Teams = mongoose.model('Teams', teamSchema);

当我查询 Teams 时,我还想获得 虚拟生成的小队

Teams.find({}, function(err, teams) {
  JSON.stringify(teams); /* => [{
      name: 'team-1',
      squad: [{ name: 'player-1' } , ...]
    }, ...] */
});

但我无法得到这个使用虚拟,因为我需要一个异步调用:

teamSchema.virtual('squad').get(function() {
  Players.find({ team_id: this._id }, function(err, players) {
    return players;
  });
}); // => undefined

实现此结果的最佳方法是什么?

谢谢!

【问题讨论】:

    标签: node.js mongodb asynchronous mongoose virtual


    【解决方案1】:

    这可能最好作为instance method 添加到teamSchema 来处理,以便调用者可以提供回调来接收异步结果:

    teamSchema.methods.getSquad = function(callback) {
      Players.find({ team_id: this._id }, callback);
    });
    

    【讨论】:

    • 但是例如在一个 CRUD 服务中,我现在想要获取包含小队的团队列表,我必须在 teams.find -> 遍历每个团队 -> 每个团队的 getSquad ->创建一个团队数组的克隆(因为我无法在返回的数组中注入新属性)并为每个团队注入小队 -> res.json(clonedArray)?
    • 当您需要像这里一样操作查询结果时,请在查询中使用lean()teams.find().lean().exec(cb)
    • 今天有更好的解决方案吗?
    • 今天呢? 3年后
    • 根据this mongoose-fill 插件可能是一个选项
    猜你喜欢
    • 2011-12-29
    • 2011-08-29
    • 2012-10-28
    • 1970-01-01
    • 2020-10-14
    • 2021-02-07
    • 1970-01-01
    相关资源
    最近更新 更多