MongoDB:如何通过子文档ID查找?

Phi*_*das 7 mongoose mongodb

我想的概念模型games,其中teamsplayersMongoDB中相互竞争.

我有两个系列:playersgames.

这就是文档的games外观.

{
    "_id": { "$oid": "1" },
    "teams": [
        {
            "players": [
                {
                    "player": { "$oid": "2" },
                    "score": 500,
                },
                {
                    "player": { "$oid": "3" },
                    "score": 550,
                }
            ]
        },
        {
            "players": [
                {
                    "player": { "$oid": "4" },
                    "score": 500,
                },
                {
                    "player": { "$oid": "5" },
                    "score": 550,
                }
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

这是任务:给定一个玩家ID,我想找到这个玩家参与的所有游戏.

我尝试过的:

db.games.find( { "teams.players.player._id": "2" } )
Run Code Online (Sandbox Code Playgroud)

但是,这不会返回任何内容.

顺便说一下,我正在使用以下架构的Mongoose:

playerSchema = Schema
    player: { type: Schema.ObjectId, ref: 'Player' }
    score: { type: Number }

teamSchema = Schema
    players: [ playerSchema ]

gameSchema = Schema
    teams: [ teamSchema ]
Run Code Online (Sandbox Code Playgroud)

使用以下CoffeeScript查询:

Game.find 'teams.players.player._id': playerId
Run Code Online (Sandbox Code Playgroud)

不返回任何玩家ID的结果.

小智 11

在您的文件中:

"players": [
            {
                "player": { "$oid": "4" },
                "score": 500,
            },
            {
                "player": { "$oid": "5" },
                "score": 550,
            }
        ]
Run Code Online (Sandbox Code Playgroud)

player嵌入式集合中的字段players是BSON Id(即它看起来像ObjectId("4e208e070347a90001000008")),所以我认为你应该像这样构造你的查询:

db.games.find( { "teams.players.player": ObjectId("2") } )
Run Code Online (Sandbox Code Playgroud)

注意,我放弃了_id- 如果在mongo控制台中工作,那么我怀疑Coffee查询将是类似的(删除_id部分).