2013-01-25 100 views
0

我在mongodb數據庫中有2個系列。 例如:與mongodb相關的問題

employee(collection) 
    _id 
    name 
    gender 
    homelocation (double[] indexed as geodata) 
    companies_worked_in (reference, list of companies) 

companies(collection) 
    _id 
    name 
    ... 

現在我需要查詢所有公司誰的名字開始與「世界衛生大會」,有/有其住在附近的員工(13.444519,52.512878)即。

我該如何做,而不用花太長時間? 有了SQL它會一直一個簡單連接(不geospatiol搜索當然... :()

回答

1

可以發出2個查詢(查詢我寫的是在JavaScript)

首先查詢提取所有公司的名字開始與wha

db.companies.find({name: {$regex: "^wha"}}, {_id: 1}) 

第二個查詢可以像

db.employees.find({homelocation: {$near: [x,y]}, companies_worked_in: {$in: [result_from_above_query]} }, {companies_worked_in: 1}) 

現在只過濾companies_work ed_in並且只有那些名稱以wha開頭的公司。我知道在這種情況下,第一個查詢似乎是無用的。但是很多記錄會被查詢中的$所過濾。

您可能必須在這兩個查詢之間編寫一些中間代碼。我知道這不是一個單一的查詢解決方案。但是,這是一種可行的方式,並且性能也很好,具體取決於您索引的領域。在這種情況下,考慮在name(公司集合)和homelocation(地理索引)+ companies_worked_in(員工集合)上創建索引將幫助您獲得性能。

P.S. 我懷疑你是否可以創建一個超過homelocationcompanies_worked_in的複合索引,因爲它們都是數組。你將不得不在這些字段之一上索引。您可能無法獲得組合索引。

建議 將公司名稱也存儲在員工集合中。這種方式可以避免第一次查詢。

+0

那麼,我會找到員工,這是/該工作附近的工作,但我需要公司... – andre

+0

我編輯了我的答案。我知道它可能看起來不太優雅。但這是一種可以考慮的方式。性能明智的罰款。如果您還將職員名稱存儲在員工集合中,則可以避免第一個查詢。 –

+0

另一個問題是,標籤的順序不再是距離的順序了(如果我使用「內」,而不是「接近」,我這樣做)。 – andre