2011-06-21 25 views
2

私はEventsという名前のコレクションを持っています。各Event文書には、Participantsのコレクションが組み込まれています。MongoDB - 埋め込み文書のクエリ

今は私の質問です。Eventを照会してすべてを取得する方法はありますか?Participants thats ex。年齢> 18?

答えて

1

MongoDBでコレクションをクエリすると、デフォルトでクエリに一致するドキュメント全体が返されます。必要に応じてスライスして、単一のサブ文書を取り出すことができます。 「Over18」と呼ばれるイベント文書内サブドキュメントに

  1. ストアそれら:

    あなたが望むすべてが18よりも古い参加者である場合、それはおそらく2つのいずれかを行うことをお勧めだろうか何か。そのドキュメントに挿入します(必要に応じて他のドキュメントに挿入します)。コレクションにクエリを実行すると、 "Over18"サブドキュメントのみを返すようデータベースに指示できます。これの欠点は、参加者を2つの異なるサブ文書に保管し、挿入する前に年齢を把握する必要があることです。これはあなたのアプリケーションによっては可能かもしれません。任意の年齢(18歳、時には21歳、25歳など)をチェックできるようにする必要がある場合は、これは機能しません。

  2. コレクションを照会して、参加者のサブ文書を取得して、アプリケーションコードでフィルタします。何人かの人々が信じているかもしれませんが、これはひどいことではありません。あなたのデータベースをやってみたくないからです。多くの仕事があります。アプリケーションに計算をオフロードすると、クエリに時間を費やして時間を節約できるため、データベースに実際に役立つ可能性があります。長期的にはスケーラビリティが向上します。将来の参照のため

+0

提案のおかげで感謝:) - 提案2について:それは、除外する必要がある場合、私のアプリのパフォーマンスに影響を与えますか?アプリで120.000のドキュメントは、データベースでそれをフィルタリングと比較?おそらく、 – ebb

+0

。それは本当にアプリケーションに依存しますが、120k文書は大変です。私はそれをベンチマークして見なければならないと思う。オプション1が可能でなく、オプション2がスケーラブルでない場合は、一歩前に戻ってドキュメント構造を再検討してください。 –

0

短い回答:いいえ。私は数ヶ月前に同じことをやろうとしましたが、mongoDBはそれをサポートしていません(少なくともバージョン< = 1.8で)。同じ質問がGoogleグループで確実に求められています。参加者を別のコレクションとして保存するか、ドキュメント全体を取得してから、クライアントでフィルタリングすることができます。理想から遠い、私は知っている。私はまだこの制限を回避する最善の方法を見つけようとしています。

+0

DBではなくクライアントでフィルタリングすると性能に影響しませんか? – ebb

+0

私はそれがあなたが働いている文書の数に依存すると思います。ここではRAMが非常に重要です。mongoはドキュメントをメモリに保存し、使用可能なRAMを利用しようとするほど、mongoが実行するファイルシステムの操作が少なくて済みます。 とにかく、できることは何もありません。あなたがやりたいことは、現在サポートされていません。 –

0

:nは数である。これは、n個の文書のリストが返され

db.events.aggregate(
    { $unwind: '$participants' }, 
    { $match: {'age': {$gte: 18}}}, 
    { $project: {participants: 1} 
) 

:これは、このように集約することにより、新たな集約フレームワークを使用するMongoDB 2.2に可能であろう

{ 
    _id: objectIdOfTheEvent, 
    participants: { firstName: 'only one', lastName: 'participant'} 
} 

それはおそらくRにサーバー上で平坦化することができます。各エントリは、この(「参加者」配列フィールドは、現在の代わりに単一のエントリを保持していることに注意してください)のように見える参加者> 18参加者のリストを表示します。詳細については、officcial documentationを参照してください。

関連する問題