Node.js Mongoose找到嵌套模型了吗?
以下是我的mongodb文档的外观(当然是json格式) 因此,当路径Node.js Mongoose找到嵌套模型了吗?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,以下是我的mongodb文档的外观(当然是json格式) 因此,当路径api/teams/50/players/100命中时,我想发球Jokim。我试图阅读其他关于猫鼬嵌套文档的帖子,但我似乎找不到我在这里寻找的答案。我只是想找到文件,我已经有路线设置 models.Team.find({'players._id':req.params.id }, function(err, player) { if (err) { res.json({error: 'player no
api/teams/50/players/100
命中时,我想发球Jokim
。我试图阅读其他关于猫鼬嵌套文档的帖子,但我似乎找不到我在这里寻找的答案。我只是想找到文件,我已经有路线设置
models.Team.find({'players._id':req.params.id }, function(err, player) {
if (err) {
res.json({error: 'player not found.'});
} else {
res.json(player);
}
});
这是我的模式
var Team = new Schema({
team_name: { type: String },
players: [
{
player_name: { type: String },
points: { type: Number },
made_one: { type: Number },
made_two: { type: Number },
made_three: { type: Number },
missed_one: { type: Number },
missed_two: { type: Number },
missed_three: { type: Number },
percentage: { type: Number },
assists: { type: Number },
rebounds: { type: Number },
steals: { type: Number },
blocks: { type: Number },
fouls: { type: Number },
feed: { type: String },
facebook_id: { type: Number }
}
],
points: { type: Number },
made_one: { type: Number },
made_two: { type: Number },
made_three: { type: Number },
missed_one: { type: Number },
missed_two: { type: Number },
missed_three: { type: Number },
percentage: { type: Number },
assists: { type: Number },
rebounds: { type: Number },
steals: { type: Number },
blocks: { type: Number },
fouls: { type: Number },
feed: { type: String }
});
因此,您正在寻找的方法可能使用该方法。当然,您将从路线中提取您的
团队id
和球员id
值:
models.Team.aggregate(
[
// Makes sense to match the document
{ "$match": {
"_id": team_id,
"players._id": player_id
}},
// Unwind the players array
{ "$unwind": "$players" },
// Match the player only
{ "$match": { "players._id": player_id } },
// Just project the player
{ "$project": { "_id": 0, "player": "$players" } }
],
function(err,docs) {
// do work here
}
);
因此,虽然位置投影允许您投影作为父文档一部分匹配的单个数组元素,但聚合管道中的投影表单允许您完全重新成形,以便只在响应中包含匹配的数组元素
有关聚合的更多信息,请参阅手册中的
但对于您所展示文档的基本示例:
db.teams.aggregate([
{ "$match": {
"_id": 50,
"players._id": 100
}},
{ "$unwind": "$players" },
{ "$match": { "players._id": 100 } },
{ "$project": { "_id": 0, "player": "$players" } }
])
给出了结果:
{ "player" : { "_id" : 100, "player_name" : "Jokim" } }
当您查询
团队时
,Mongoose返回的文档与您的模式具有相同的结构,因此您需要从该结构中取出您正在寻找的播放器
使用来标识查询中匹配的第一个玩家,以便您的结果在玩家
数组字段中仅包含该玩家:
models.Team.findOne(
{'players._id': req.params.id },
{'players.$': 1},
function(err, team) {
if (err || !team || !team.players || !team.players.length) {
res.json({error: 'player not found.'});
} else {
res.json(team.players[0]);
}
}
);
请注意,之所以使用
findOne
而不是find
,是因为您只查找包含该玩家的单个团队。不太确定您的意思,因为您所做的查询没有理由不起作用。你希望只检索嵌套文档吗?是的,我正在尝试获取一个特定的模型,这里路线的目的是获取ById路线需要获取团队,然后获取玩家。所以它是一个集合中的集合api/teams/:id/players/:id
然后我会使用req.params.id
作为通配符哇,这是新的:)好的,让我绕一圈this@MichaelJosephAubry你到底有什么事不能去上班?正如您在问题中所显示的,您的模式已嵌入,不是吗?我只是觉得有一种更简单的方法models.Team.find({'players.player_name':'Jokim'}
这将返回所有玩家…感谢您的努力,但我将继续摆弄它,直到我找到答案…让我再试一次您的解决方案可能我的路线被弄乱了我只是在我res.json(docs)时得到一个空数组
我现在正在传递静态id,直到找到合适的json响应为止。我找到了一种使用这种方法,{code>{id:req.params.teamid},{players:{$elemMatch:{{id:req.params.playerid}}然后在res.json中我使用了res.json(player[0]。players);
你认为他们做了同样的事情吗?
models.Team.findOne(
{'players._id': req.params.id },
{'players.$': 1},
function(err, team) {
if (err || !team || !team.players || !team.players.length) {
res.json({error: 'player not found.'});
} else {
res.json(team.players[0]);
}
}
);