db.collection.find() を使用してサブドキュメント内の特定の値を照会し、一致するドキュメントを見つける方法はありますか? 例えば:
{ { 'ジョー' : {目の色 : '茶色'}, { 'メアリー' : {目の色 : '青'}, .... }
目の色が青い人全員の名前を返したいです。
検索を機能させるには、値へのフル パスを指定する必要があります。
db.people.find({ "Joe.eyecolor" : "brown" })
条件に一致する配列要素のみを返す方法がないため、現在使用している連想配列スタイルの代わりに人の配列に切り替えることはできません。を使用して最初の一致$elemMatch
を返すことができますが、それはおそらくあなたが望むものではありません。または、引き続き配列を使用することもできますが、(データベースではなく) クライアント コード内で配列をさらにフィルター処理する必要があります。
集約フレームワークを使用できるかもしれませんが、$unwind
配列全体が必要になるため、インデックスを効率的に使用してから、フィルタリング、ブルート フォースを実行することはできません。また、含まれるデータがより複雑な場合、AF を使用する際のプロジェクションではすべてのフィールドを手動で指定する必要があるため、少し面倒になります。
表示しているクエリを最も効率的に実行するには、サブドキュメントを使用せず、代わりに人々を個別のドキュメントとして配置する必要があります。
{
name: "Joe",
eyecolor: "brown"
}
次に、次のような単純な検索を実行できます。
db.people.find({eyecolor: "brown"})