9

私は、MongoDBで互いに競合するgames場所teamsの概念をモデル化しようとしています。players

私は2つのコレクションを持っています: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,
                }
            ]
        }
    ]
}

タスクは次のとおりです。プレーヤーIDを指定して、このプレーヤーが参加したすべてのゲームを検索します。

私が試したこと:

db.games.find( { "teams.players.player._id": "2" } )

ただし、これは何も返しません。

ちなみに、私は次のスキーマでMongooseを使用しています。

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

teamSchema = Schema
    players: [ playerSchema ]

gameSchema = Schema
    teams: [ teamSchema ]

次のCoffeeScriptクエリを使用します。

Game.find 'teams.players.player._id': playerId

これは、どのプレーヤーIDに対しても結果を返しません。

4

2 に答える 2

12

あなたの文書で:

"players": [
            {
                "player": { "$oid": "4" },
                "score": 500,
            },
            {
                "player": { "$oid": "5" },
                "score": 550,
            }
        ]

player埋め込みコレクションのフィールドはplayersBSON Id (つまり、 のようなものObjectId("4e208e070347a90001000008")) であるため、次のようにクエリを構成する必要があると思います。

db.games.find( { "teams.players.player": ObjectId("2") } )

--を削除したことに注意してください。これが_idmongo コンソールで動作する場合は、Coffee クエリも同様になると思われます (_id一部を削除します)。

于 2013-02-19T01:33:23.553 に答える