1

次のドキュメントがあるとします。

{"classes":3,
"people" : [

    {name:John,
    age:20,
    city:London}

    {name:Alice,
    age:56,
    city:Dublin}

]
}

私のデータベースにはこのようなドキュメントがたくさんあります。配列内の最初のサブドキュメント(ここではJohn)のみを選択し、最初のサブドキュメント内の人の年齢に基づいてすべてのドキュメントを並べ替えたいと思います。また、クラスの数がゼロより大きいドキュメント全体のみを選択したいと思います。各ドキュメントの最初の人の年齢でソートされたタプルを作成したいのですが、これが私のアイデアでした。

sorted([(m['age'], m) for m in people.find({"classes":{'$gt':0}},{'people.1':1}  )])

ご協力ありがとうございました。

4

2 に答える 2

2

pymongoドライバーで並べ替えてみてください(並べ替えの方向とpymongoのメソッドの引数を制御することもできDESCENDINGますASCENDINGsort

from pymongo import DESCENDING
people = db.people.find({"classes": {'$gt': 0}}).sort('people.0.age', DESCENDING)

次に、Pythonを使用してタプルのリストを作成します。

[(p['people'][0]['age'], p) for p in people]

私があなたの問題を正しく理解していることを願っています。

于 2012-11-26T12:41:03.723 に答える
1

パフォーマンス上の理由から、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 } ] }
于 2012-11-26T15:00:19.170 に答える