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方法的参数DESCENDINGASCENDING参数来控制排序的方向sort):

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

出于性能原因,您应该在 Mongo 而不是 Python 中进行选择和排序。我不知道您是想要元组中的整个子文档还是只想要年龄,但这是您的操作方法。

样本数据:

> 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 回答