【问题标题】:Populating nested array with ObjectIDs使用 ObjectID 填充嵌套数组
【发布时间】:2014-11-05 01:38:31
【问题描述】:

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

【问题讨论】:

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

标签: mongodb mongoose mongoose-populate


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-01-06
      • 1970-01-01
      • 2018-06-07
      • 2015-03-26
      • 2020-06-07
      • 2021-01-14
      • 2018-07-05
      • 2021-06-06
      相关资源
      最近更新 更多