パフォーマンス上の理由から、PythonではなくMongoで選択と並べ替えを行う必要があります。サブドキュメント全体がタプルに含まれるのか、それとも年齢だけが必要なのかはわかりませんが、これがどのように行われるかを示しています。
サンプルデータ:
> db.tuple.find({},{_id:0})
{ "classes" : 3, "people" : [ { "name" : "John", "age" : 20, "city" : "London" }, { "name" : "Alice", "age" : 56, "city" : "Dublin" } ] }
{ "classes" : 3, "people" : [ { "name" : "John", "age" : 50, "city" : "London" }, { "name" : "Alice", "age" : 56, "city" : "Dublin" } ] }
{ "classes" : 3, "people" : [ { "name" : "John", "age" : 10, "city" : "London" }, { "name" : "Alice", "age" : 56, "city" : "Dublin" } ] }
{ "classes" : 0, "people" : [ { "name" : "John", "age" : 10, "city" : "London" }, { "name" : "Alice", "age" : 56, "city" : "Dublin" } ] }
{ "people" : [ { "name" : "John", "age" : 15, "city" : "London" }, { "name" : "Alice", "age" : 56, "city" : "Dublin" } ] }
クラス>0の場合、年齢でソートされた最初の配列ドキュメントのみを返します。
> db.tuple.find({classes:{$gt:0}}, {_id:0,"people":1,"people":{$slice:1}}).sort({"people.age":1})
{ "classes" : 3, "people" : [ { "name" : "John", "age" : 10, "city" : "London" } ] }
{ "classes" : 3, "people" : [ { "name" : "John", "age" : 20, "city" : "London" } ] }
{ "classes" : 3, "people" : [ { "name" : "John", "age" : 50, "city" : "London" } ] }
年齢だけを返すのと同じこと:
> db.tuple.find({classes:{$gt:0}}, {_id:0,"people.age":1,"people":{$slice:1}}).sort({"people.age":1})
{ "people" : [ { "age" : 10 } ] }
{ "people" : [ { "age" : 20 } ] }
{ "people" : [ { "age" : 50 } ] }