Mongodb 用objectid填充嵌套数组

Mongodb 用objectid填充嵌套数组,mongodb,mongoose,mongoose-populate,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: tr

尝试在我的架构中填充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'
  }]
});
// 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);
    });
  });
};
到目前为止,我一直试图像这样填充它,这显然不起作用

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);
    });
};

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

现在,我的工作函数如下所示:

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'
  }]
});
// 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方法需要回调函数才能工作,所以我刚刚添加了它,瞧,它返回了我的用户对象。

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

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

它对我的项目非常有效

你能举一个例子说明你是如何保存游戏对象的吗?这应该是可行的,只是在一个测试应用程序中尝试了相同的结构,效果很好。@Matrik编辑了我如何向游戏添加管理员的代码。当我从API获取游戏文档时,所有数据都是正确的,我可以看到管理员ID保存在数组中。如果我回答了你的问题,请告诉我。。是的,看起来不错。您正在运行哪个版本的mongodb。我不知道这是否有区别,但我记得在升级版本之前,我在“填充”方面遇到了问题。@Matrik我在版本2.6.0上,所以我将brew升级到了2.6.4,但一开始并没有解决问题。不过,我查看了一些更多的mongoose文档并使其正常工作,我将在答案中发布我找到的解决方案。谢谢你的帮助!