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

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

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

           ]
}

我的数据库中有很多这样的文件。我只想选择数组中的第一个子文档(这里是 John),然后创建一个只有第一个子文档的年龄的有序元组。(我也只想要类数大于 0 的总文档)

我正在尝试这样做:

list = db.people.find({"classes": {'$gt': 0}})
records = sorted([(p["people"][0]["age"], p) for p in list])

但是此代码返回

IndexError: list index out of range

感谢您的帮助。

4

1 回答 1

0

我相信这里发生的事情是您的查询返回的某些文档有一个空的“人”数组,因此当您尝试访问时,p[people][0]您会收到有关列表索引超出范围的错误,因为在索引 0。

如果您希望集合中的所有元素都应该始终有一个非空的 people 数组,那么您应该找出这些对象存在的原因。另一种选择是将您的查询更新为更具选择性,并且不返回对象

db.people.find({"classes": {'$gt': 0}, 'people.0' : { '$exists' : True}})

根据您对数据的建模方式,可能会有更合适的查询,这将允许您排除具有空人员数组的对象。您还应该考虑如果您的对象完全缺少人员数组会发生什么。

于 2012-11-27T22:33:26.207 回答