使用ObjectID填充嵌套数组

时间:2014-09-11 07:40:18

标签: mongodb mongoose mongoose-populate

尝试在我的架构中填充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);
    });
};

2 个答案:

答案 0 :(得分: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方法需要回调函数才能工作,所以我刚刚添加了,瞧,它返回了我的User对象。

答案 1 :(得分:0)

要填充一个数组,你只需要在路径字段之后输入模型名称字段,如下所示:

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

它完美地适用于我的项目...