2011-10-11 143 views
4

(很抱歉,如果這是一個簡單的問題。)如何在此嵌套文檔結構(MongoDB)中進行查詢?

我有一個看起來像這樣(Python語法)文件:

{ 
    '_id': SomeObjectId, 
    'features': [ 
       {'id': 'featureX' , 'value': 6}, 
       {'id': 'featureY', 'value': 45} 
       ] 
} 

採用這種結構可以很容易地找到包含「featureX」中的所有文件功能列表。但我也有興趣檢索子文檔中的相關值。 我想在Python中,如果我得到這樣的查詢文檔:db.articles.find({'features.id': 'featureX'})然後我需要遍歷數組的'功能'找出正確的'價值'。有沒有其他類型的查詢可以給我有趣的價值(在這種情況下,我不需要檢索完整的文檔,只有部分{'id':'featureX','value'): 6},該不會是在陣列中的可預測指標值

PS:我想我會設計不同的文件,但我仍然有興趣知道,如果上述resquest是可行的

這裏是新的結構:

{ 
'_id': SomeObjectId, 
'features': { 
       'featureX': { 'someproperty':'aaa', 'value':6 }, 
       'featureY': {'someproperty' :'bbb', 'value':45} 
      } 
} 

是否有關於這個d任何問題esgin? 在我的例子'featureX'中,'featureY'是唯一的,因此使用它作爲字典鍵不是問題。

編輯: 我需要澄清的是,我將需要在文檔中原子地更新'featureX'和'featureY',並且需要更新MongoDB does not support transactions。 另外,第二種設計雖然不允許檢索子文檔,但應該能夠很容易地在客戶端代碼中快速獲得所需的信息,假設我可以查詢具有特定鍵的子文檔。

我認爲這個查詢應該做的工作:

result = db.articles.find_one({ 'features.featureX': {'$exists': True} }) 
interesting_value = result['features']['featureX']['value'] 

回答

2

我已經回答了這對夫妻的有關從蒙戈集合here獨自拿起子文檔倍,here

只要有目前沒有辦法做到這一點。這是過濾多級嵌入式文檔的行爲,通常匹配過濾器將返回整個文檔,而不是子集。

與此positional ($) operator in fields to return specifierAbility to make use of a subdocument's data whose contents were used to satisfy a query using the $ operator有關的mongo中有兩個未解決的問題。 (如果你真的需要該功能,請登錄投票)

而你的替代模式在這裏也沒有用。

所以你必須在每個功能存儲在單獨的文件中這樣使它工作你想

功能1

{ 
'_id': SomeObjectId, 
'name' :'some name', 
'value': 'feature 1', 
'some_field' : 'zzz' 
} 

功能2

{ 
'_id': SomeObjectId, 
'name' :'some name', 
'value': 'feature 2', 
'some_field' : 'zzz' 
} 

和查詢

方式
db.features.find({'_id':someobjectid}) 

只會返回具體功能

+0

謝謝。我認爲我的備用模式能夠快速檢索所需的值,而無需掃描客戶端代碼中的所有子文檔。我想我不能將功能放在單獨的文檔中,因爲我需要功能的原子更新,並且mongodb不支持事務。 – ixi

+1

是的,這是真的,它更容易掃描客戶端的子文檔,因爲你有一個字典類結構。 – RameshVel