1

各ドキュメントの一連のフィールド値を持つコレクションがあります。これらの 1 つは「座標」と呼ばれます。このフィールドでnullではない要素についてDBにクエリを実行すると、期待どおりに正しい値が返されます。

ただし、Python(Pymongo)で時々このエラーに遭遇します:

if not doc['coordinates']
TypeError: 'NoneType' object has no attribute '__getitem__'

これは、フィールド「座標」がないレコードに遭遇したことを意味しているようです。このフィールドを持つドキュメントを作成したので、存在するはずです。

ただし、このエラーを処理する方法と、このエラーがプログラムを終了させないようにする方法を知りたいです。

これは、適切なクエリを見つける方法です。

 cursor = collection.find(
                { "$and" : [
                    {"term": {"$in": events}}, 
                    { "$or" : [
                            {"coordinates" : {"$ne": None}}, 
                            {"place" : {"$ne" : None}}
                    ]}
                ]}, 
            {"term" : 1, "coordinates" : 1, "place" : 1, "time_normal" : 1}, tailable = True, timeout = False )

次に、返されたクエリを次のように繰り返し処理します。

while cursor.alive:
    try:
        doc = cursor.next()

        CODE IS HERE TO QUERY DB


    except StopIteration:
        pass

ありがとう

4

4 に答える 4

2

TypeErrorあなたAttributeErrorの例と nickmilon が提供した例でa を取得している理由は、取得するために使用しているクエリがdoc何も見つからないためです (したがって a ですNoneType)。クエリをチェックして、コレクションから実際に取得していることを確認してください。

ただし、ニックミロンが提供する答えは、あなたが求めているエラー処理を提供するはずです。

于 2012-12-16T15:56:18.147 に答える
1

あなたが試すことができます: doc.get('coordinates') フィールドが存在しない場合は None を返し、存在する場合はその値を返します

于 2012-12-16T15:27:07.177 に答える
1

エリックは正しいです。何らかの理由であなたのドキュメントはなしです。find に使用しているコードと、 find から返されたカーソルを処理する方法をここに投稿できますか?

于 2012-12-16T16:38:09.670 に答える
0

次のように、例外ブロックに TypeError を含めることで、このエラーを処理できました。

                try:                                               
                    if not doc['coordinates']:
                        CODE HERE

                    else: 
                        CODE HERE

                except (TypeError):
                    pass
于 2012-12-16T20:35:21.883 に答える