2012-05-07 18 views
9

を満たすすべてのサブ文書でドキュメントを見つける:私の知る限り理解しMongoDBのは、私は私のDBにゲームのコレクションを持っている状態

var game = { 
    players: [{username:"user1", status:"played"}, 
      {username:"user2", status:"accepted"}] 
} 

は、このようなクエリ:db.games.find({"players.status":"played"})は私に少なくとも一つのプレイヤーがステータスを持つすべてのゲームを与えます"遊んだ"。ステータスが「再生済み」のすべてのプレイヤーでゲームを見つけるにはどうすればよいですか?

+0

をより柔軟な溶液で議論:HTTP ://stackoverflow.com/questions/11823296/mongodb-find-subdocument-in-array-matching-parameters/11823340#11823340 –

答えて

11

1つのだけ他のステータスを持っている場合は、クエリを使用して「演奏」より:

db.games.find({ "players.status": { $ne:"accepted" } }) 

あなたがいる限り、彼らはすべてのクエリの時点で知られているような、より多くのステータス値を処理するために、クエリを調整することができます。

+1

これが私のやり方です。さらに良い方法があるのだろうかと疑問に思っています。新しいゲームの状態を追加するたびにクエリを変更する必要があります。 – andr111

+1

クエリを動的にすることができます。すべての状態値のセットを配列として作成し、それから "再生"を削除し、$ nin(not in)操作で使用するとうまくいくはずです。 –

+0

ありがとう、私はこれを行うことができる唯一の方法だと思います。 – andr111

-1

は、集約フレームワークの$アンワインド機能を使用:

db.collection.aggregate([{$リラックス: "$のplayers.statusを"}、{$マッチ:{ "players.status": "再生します"}、{$プロジェクト:{" _ ID ":0、" players.status ":1}}])

(この回答チェックアウト:https://stackoverflow.com/a/15082321/1214167)ここ

+1

OPが望んでいるものと一致しません。これはステータスが「再生済み」のプレイヤーだけを返します。問題はすべてのプレイヤーがプレイしたチームを返すことでした。演奏したプレイヤーの数をカウントし、それを完全な配列のサイズと比較するようにクエリを拡張することで、集計で行うことができますが、それは単純な検索より複雑で低速です。 –

関連する問題