Mongodb 用objectid填充嵌套数组
尝试在我的架构中填充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
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文档并使其正常工作,我将在答案中发布我找到的解决方案。谢谢你的帮助!