2015-05-26 49 views
2

我試圖找到使用'_id'的第n個對象,它在同一個文檔中。如何找到mongoDB中第n個嵌套級別的對象? (單個集合,單個文檔)

任何建議或參考或代碼示例,將不勝感激。

(例如)

文件看起來如下:

{ 
    "_id": "xxxxx", 
    "name": "One", 
    "pocket": [{ 
     "_id": "xxx123", 
     "name": "NestedOne", 
     "pocket": [] 
    }, { 
     "_id": "xxx1234", 
     "name": "NestedTwo", 
     "pocket": [{ 
      "_id": "xxx123456", 
      "name": "NestedTwoNested", 
      "pocket": [{"_id": "xxx123666", 
       "name": "NestedNestedOne", 
       "pocket": [] 
      }] 
     }] 
    }] 
} 

的插口應持有更多的口袋,它是動態的。

在這裏,我想搜索「口袋」使用「_id」,說「xxx123456」,但不使用靜態引用。

再次感謝。

+1

很難更新嵌套的動態密鑰,並不是好的做法,以保持數據太嵌套。看完你的文檔後,我不明白你爲什麼把口袋放在口袋裏面......'是更好的方法來改變文檔結構,然後使用更新 – Yogesh

回答

0

我強烈建議你改變你的文檔結構的東西更容易管理/搜索,因爲這隻會更加痛苦一起工作的。

爲什麼不使用多個集合,像this answer解釋呢?

因此,一個簡單的方法來思考這個您的情況,我希望是更容易爲你推理比下降一些架構代碼...

  1. 存儲所有東西在同一個孩子文件。給他們獨特的_id s。
  2. 將其pocket的所有內容存儲爲集合。收藏品只需保存通常在口袋內的所有id(而不是自己參考口袋)。

這樣一來,你的很多工作可以在外面發生的DB調用。您只需在需要時批量提取所需的項目,而不是搜索嵌套的文檔!

但是,如果你能在整個文檔工作:
看起來你想要做一個遞歸搜索某深層次的數目。我會用一些僞代碼給你一個大概的想法,希望你能夠把其餘部分弄清楚。

說你的功能將是:

function SearchNDeep(obj, n, id){ 
    /** 
    You want to go down 1 level, to pocket 
    see if pocket has any things in it. If so: 
    Check all of the things...for further pockets... 

    Once you've checked one level of things, increment the counter. 
    When the counter reaches the right level, you'd want to then see if the object you're checking has a `'_id'` of `id`. 
**/ 
} 

這是一般的想法。有一種更簡潔,遞歸的方式來執行此操作,您可以調用SearchNDeep,同時傳遞一個數字表示您的深度,基本情況是沒有更多級別或者找到該對象。

如果你沒有找到它,請記住返回falseundefined,如果你這樣做的話正確的對象!祝你好運!

相關問題