2016-06-23 7 views
1

私はアグリゲーションパイプラインで実行独自機能

cursor = collection.aggregate(
    [ 
    {"$match":{"Time":{"$gte" : datetime.datetime(2016, 4, 4)}}}, 
    {"$group":{"_id": "$Name", "LatLong": {"$cond": [ { "$lte":[distanceFromGPS(latitude1,longitude1,"$Latitude","$Longitude"), 2]}, {"$addToSet": {"Lat":"$Latitude","Long":"$Longitude" }}, ]}}}, 
    {"$project": { "Name":"$_id","LatLong":1,"_id":0,"Count": { "$size":"$LatLong" }}}, 
    {"$sort":{"Count":-1}} 
    ] 
) 

を、この機能を実行したい機能

distanceFromGPS(latitude1,longitude1,latitude2,longitude2): 
latitude2=float(latitude2) 
longitude2=float(longitude2) 
R = 6371 
dLat = math.radians(latitude2-latitude1) 
dLon = math.radians(longitude2-longitude1) 
a = math.sin(dLat/2) * math.sin(dLat/2) + math.sin(dLon/2) * math.sin(dLon/2) * math.cos(math.radians(latitude1)) * math.cos(math.radians(latitude2)) 
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a)) 
d = R * c 
return d 
latitude1 = 1.0 
longitude1 = 1.0 

を持っている私は、エラーどのように

ValueError: could not convert string to float: $Latitude

を取得します私はこれをすることができますか? LatitudeフィールドとLongitudeフィールドは両方とも浮動型です。

+0

機能を果たしているようですが、入力が悪いです。エラーを読むと '$ Latitude'は浮動小数点に変換できないと言われています。 Pythonは、数字ではないことをあなたに伝えています。 – Delioth

+0

mongodbの緯度は文字列型です。浮動小数点数ですが、 "52.678"私はlatitude2 = float(latitude2)を持っています。 longitude2 = float(longitude2)です。何かお勧めしますか? – glitterati

+0

この関数は文字列 '' $ Latitude ''を取得しています。この関数は浮動小数点数に変換できません。関数を' distanceFromGPS(latitude1、longitude1、 "$ Longitude"、 "$ Longitude") '、lat/long1どちらも変数参照ですが、他の2つはリテラル文字列を関数に渡しています。あなたはlambdaをそのままラップすることで修正できるかもしれません。Pythonはそれを 'aggregate()'に渡す前に実行します。 – Delioth

答えて

0

Re:すべてのドキュメントを2度読んだ後、私はあなたができないという結論に達しました。適切な効果を得るには、mongoのaggregation pipeline operatorsを使用して関数を書き直す必要があります。

+0

私は現在、LatitudeとLongitudeをデータベース上で浮動小数点に変換しました。今それを行う方法はありますか?私はまだエラーが発生します。 – glitterati

+0

mongodbの集約フレームワークは、集約コールの中でPython関数を呼び出そうとする試みを処理できません。私の理解が行く限り、mongo固有のパイプライン演算子しか処理できません。 – Delioth

+0

私はドキュメントを読んでそう思った。これを行う別の方法がありますか? – glitterati

関連する問題