2014-03-29 125 views
0

PyMongo查詢我有一系列存儲在我的數據庫這樣的帖子:與謂詞函數

{ 
    content: 'foo', 
    location: (37.423021, -122.083739) 
}, 
{ 
    content: 'bar', 
    location: (37.422473, -122.090386) 
} 

我也有一個功能between可以計算距離,以英里,兩點之間。其工作原理如下:

>>> between((37.423021, -122.083739), (37.422473, -122.090386)) 
0.36649505427211615 

我用它來構建一個謂詞函數valid,將採取在文檔中,並返回一個布爾值,標誌着它是否是有效的。該功能可能會看起來像:

def valid(document): 
    return between(document.location, CONSTANT_LOCATION) 

是否有可能使用此謂詞作爲選擇的查詢?

回答

1

是的,你可以。您可以使用搜索中提供的自定義JavaScript功能執行此操作。請注意,你必須在JavaScript之間編寫你的。

在mongo中檢入$where子句,但請記住它會對集合進行全面掃描。

db.myCollection.find({ $where: function() { 
    return (between((37.423021, -122.083739), (37.422473, -122.090386)) < 1); 
}}); 

如果計算使用半正矢看看我的optimized formula這裏2點之間的距離。

我不明白的一件事是:你如何得到第一點和第二點。看起來他們在不同的文件中。

編輯比你將沒有問題的方法,我提供。你可以在你的函數中寫回你的函數,或者嘗試保存你的函數(它已經在某處解釋瞭如何實現),並以我展示的方式調用它。使用文檔中的座標 - 您必須執行以下操作:this.location[0],this.location[1]

+0

爲了說明起見,第一點是硬編碼到函數中。第二個應該是查詢文檔的一個屬性。 –

+0

@AnkitRanjan酷。我編輯了答案。 –

+0

是否可以使用Python函數作爲'$ where'子句? –