2013-12-09 57 views
0

我有四個文件Recusively掃描子文件

{_id:as1d2a1das2d1afdfd, content:{ name: 'John'} } 
{_id:sdasd512a12asdad, content:{ sub: {name:'John'}}} 
{_id:sdaasddasdassd512a12, content:{ sub: {sub1:{name:'John'}}}} 
{_id:sdaasddasdassd512a12, content:{ sub: {sub1:{name:'Terry'}}}} 

哪個查詢我可以用它來找到所有文檔與具有名稱的元素屬性等於「約翰」的集合?

+1

這種情況應提示您重新考慮在其中存儲文檔的方式。我不相信有一個簡單的「僅查詢」方法來克服這一點。我很樂意被證明是錯誤的,但:) – Lix

+0

是的,只有演示我想要的,當然數據的結構不是這樣的 – Ryo

+0

如果有多個名稱屬性會發生什麼? – Lix

回答

0

眼下 MongoDB的find()僅限於one document level,您可以使用cursor和應用programming logic達到理想的解決方案通過自己的迭代擴展這一功能。

找到更多的信息:

+0

'「限於一個子文檔...級別」'?那麼find({'content.sub.sub1.name':'Terry'})'?這是一個有效的查詢,它可以分解爲2個子文檔... – Lix

+0

更正:「一個文檔級別」表示您必須使用級別1的引用來深入查看。 – theBeacon

0

要做到這一點,你必須在每個項目迭代,你的光標回報和「手動」遍歷每個文檔。

這不是一個mongo查詢!請注意,我的實際查詢是空的find()

我在這裏所做的是對結果進行迭代並過濾掉不相關的結果。

var results = []; 
db.data.find().forEach(function(doc){ 
    if (find_name_recursive(doc)){ 
     results.push(doc); 
    } 
}); 

function find_name_recursive(doc) { 
    for (var attr in doc) { 
    if (doc.name != "undefined" && doc.name == "John"){ 
     return true; 
    } 
    if (doc[ attr ] !== null && typeof(doc[ attr ]) == "object") { 
     // drill down deeper into the object 
     find_name_recursive(doc[ attr ]); 
    } 
    } 
} 

請注意,這不是測試代碼(在這臺機器上沒有mongo)。大多數遞歸搜索功能,從這個帖子採取 - Traverse all the Nodes of a JSON Object Tree with JavaScript


參考 -

+0

由於這需要對每個文檔進行完整的集合掃描和檢索,因此這不是一個特別有效的解決方案。 – WiredPrairie

+0

感謝您的支持,我已經在這裏測試您的代碼與我的數據 http://jsfiddle.net/KS9kH/29/ 但我有問題,代碼 返回find_recursive(doc [attr] [i] ); for循環似乎沒有與所有的doc [attr]元素循環,它只處理doc [attr]數組的第一個元素並返回,請幫我改正它,謝謝:) – Ryo

+0

爲漂亮的數據看,你可以使用這個http://jsonprettyprint.com/ – Ryo