0

试图在我的架构中填充 ObjectID 的数组。我查看了类似的答案,但似乎每个人的做法都略有不同,我自己也找不到解决方案。

我的架构如下所示:

var GameSchema = new Schema({
  title: String,
  description: String,
  location: String,
  created_on: { type: Date, default: Date.now },
  active: { type: Boolean, default: true },
  accepting_players: { type: Boolean, default: true },
  players: [{
    type: Schema.Types.ObjectId,
    ref: 'User'
  }],
  admins: [{
    type: Schema.Types.ObjectId,
    ref: 'User'
  }]
});

到目前为止,我一直在尝试像这样填充它,这显然是行不通的

exports.getAdmins = function(req, res) {
  Game.findById(req.params.id)
  .populate('admins')
  .exec(function(err, game) {
    return res.json(200, game.admins);
  });
};

我讨厌添加到人口问题列表中,但我查看了很多,但没有找到解决方案。任何帮助是极大的赞赏!

编辑:这是我向文档添加管理员的方式

// Add admin to game
exports.addAdmin = function(req, res) {
  Game.findByIdAndUpdate(
    req.params.id,
    { $push: { 'admins': req.params.user_id }},
    function(err, game) {
      if(err) { return handleError(res, err); }
      if(!game) { return res.send(404); }
      return res.json(200, game.admins);
    });
};
4

2 回答 2

0

好吧,我回到了 mongoose 文档,并决定改变我通过 ID 查找游戏的方式,然后填充响应。

现在我的工作功能如下所示:

// Returns admins in a game
exports.getAdmins = function(req, res) {
  Game.findById(req.params.id, function(err, game) {
    if(err) { return handleError(res, err); }
    if(!game) { return res.send(404); }
    Game.populate(game, { path: 'admins' }, function(err, game) {
      return res.json(200, game);
    });
  });
};

我遇到的问题是我试图直接使用 .findById 方法调用 .populate 函数,但这不起作用,因为我在 mongoose 的文档中发现 populate 方法需要回调函数才能工作,所以我只是添加了瞧,它返回了我的用户对象。

于 2014-09-12T17:57:39.287 回答
0

要填充数组,您只需将模型名称字段放在路径字段之后,如下所示:

 Game.findById(req.params.id)
         .populate({path: 'admins', model: 'AdminsModel'})
         .exec(function(err, game){...});

它在我的项目上完美运行......

于 2014-12-21T09:38:53.737 回答