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

ここで起こっているのは、クエリによって返されたドキュメントの一部に空の「people」配列があるため、アクセスしようとするp[people][0]と、要素がないため、リストインデックスが範囲外であるというエラーが発生することだと思いますインデックス 0。

コレクション内のすべての要素が常に空でない people 配列を持つ必要があると予想される場合は、そのようなオブジェクトが存在する理由を調べる必要があります。別のオプションは、クエリを更新してより選択的にし、オブジェクトを返さないようにすることです

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

データのモデル化方法によっては、空の people 配列を持つオブジェクトを除外できる、より適切なクエリがある場合があります。また、 people 配列が完全に欠落しているオブジェクトがある場合にどうなるかを考慮する必要があります。

于 2012-11-27T22:33:26.207 に答える