Node.js Mongoose找到嵌套模型了吗?

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

以下是我的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 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]);
        }
    }
);