0

座標フィールドに経度/緯度情報がないコレクション内のレコードを調べようとしています。Google の方法を使用して、位置情報を持つレコードを選択して座標に変換し、フィールドgeocode()の新しい値を更新しています。これは以前は.coordinatesnull

メソッドを使用しfind()て、関連するレコードを取得していますが、このコード ブロックは実行されていないようです。つまり、レコードが座標情報で更新されていません。これはコードです:

cursor = coll.find(
                {"$and": [
                            {"coordinates":  {"$type":10}}, 
                            {"place": {"$ne": None}}
                    ]}, 
            {"coordinates": 1, "place": 1, "time_normal": 1, "_id": 1}, tailable = True, timeout = False)

while cursor.alive:
    counter=0
    g = geocoders.Google()
    try:
        doc = cursor.next()
        current_id = doc['_id']
        counter+=1
        print doc  
        placeName = doc['place']['full_name']
        loc = g.geocode(placeName)
        coll.update({"_id" : current_id},{"$set": {"coordinates": loc[1]}})
        print doc          
        time.sleep(0.15)                            
    except (ValueError, geocoders.google.GQueryError):
        pass

    except StopIteration:
        break

フィールドが更新されない理由がわかりません。私はそれprint counterが0を返すことに気づいています。

ありがとう

4

1 に答える 1

1

いくつかのこと:

findクエリを少し単純化して$and、クエリセレクターに複数のフィールドを自然に「and」として含めることを削除できます。

cursor = coll.find(
    {
        {"coordinates":  {"$type":10}},
        {"place": {"$ne": None}}
    }, 
    {"coordinates": 1, "place": 1, "time_normal": 1, "_id": 1}, 
    tailable = True, timeout = False)

しかし、それで問題が発生することはなく、update通話は問題ないようです。ただし、呼び出し時にドキュメントがどのように見えたかのスナップショットであるためdoc、呼び出しによって変更されるとは思わないでください。更新の結果を確認するには、その時点で電話する必要があります。updatefindfind_one({"_id": current_id})

それでも更新されていないように見える場合はloc[1]、更新前の の内容を調べて、期待どおりであることを確認してください。

アップデート

この問題は、ドキュメントのサイズが大きくなる原因となっているキャップ付きコレクションを更新しようとしている可能性があります。docsによると、それにより更新が失敗します。

于 2012-12-20T14:51:44.833 に答える