2011-08-22 77 views
0

我想查詢一個集合中的多數民衆贊成結構像這樣蒙戈...MonogDB查詢幫助 - 子對象的查詢瓦特/扭曲

{ 
    "type":"apple" 
    "quality": { 
    "1": { 
     "owner":"Dan", 
     "age":28  
    }, 
    "2": { 
     "owner":"Joe", 
     "age":21  
    } 
    "3": { 
     "owner":"Bob", 
     "age":29  
    } 
    } 
} 

我最初嘗試findOne({"quality.owner":"Dan"})但失敗了。然後我意識到它需要完成像findOne({"quality.1.owner":"Dan"}) ...不是我想要的。

無論如何要放一個通配符代替1或按照我的意圖執行查詢嗎?我不知道所有的變量將是什麼質量的對象,所以我不認爲我可以做一個「子對象」的比賽要麼=/

編輯:

不幸的是重新格式化該數據由於第三方API正在檢索數據,並且這些索引編號表示「放置」(第一名,第二位......),因此該項目不存在問題

+0

能否「推」等級/位置下入的對象?或者按排名順序維護數組的排序順序?如果API給出的排名沒有差距,那應該是可行的... – dcrosta

回答

3

隨着你不能像你想要的那樣查詢當前模式(findOne({"quality.owner":"Dan"}))。使用嵌入式文檔,只能使用dot notation進行搜索。

但是你可以重新設計你當前的模式是這樣的:

{ 
    "type":"apple" 
    "quality": [ 
    { 
     number: 1, 
     "owner":"Dan", 
     "age":28  
    }, 
    { 
     number: 2, 
     "owner":"Joe", 
     "age":21  
    }] 
    } 
} 

,然後搜索使用點符號:

findOne({"quality.owner":"Dan"}) 
+0

'$'位置運算符僅用於更新。通過搜索數組來查找,只需省略與數組索引相對應的路徑段即可:findOne({「quality.owner」:「Dan」})' – dcrosta

+0

好吧,「你不能」是我需要的聽到=) - 讓問題保持一段時間。 –

+0

@dcrosta:是的,這是我的錯誤,現在修好了。謝謝。 –

-1

如果您可以重新配置文檔以使用數組而不是子文檔代替quality字段,那麼你可以像你想要的那樣查詢。此外,您可以efficiently index array member fields or the whole array(即子文檔本身):

db.collection.ensureIndex({"quality.owner": 1}) 
db.collection.findOne({"quality.owner": "Dan"}) 

如果轉換到使用數組,然後你可以使用the $ positional operator執行對數組元素的更新和他們的成員:

db.collection.update({"quality.owner": "Dan"}, {$set: {"quality.$.age": 27}}) 
+0

定位運算符只適用於數組 –

+0

對不起,這就是我的意思 - 就像「你甚至可以使用'$'一次你轉換爲數組。「將更新以澄清。 – dcrosta