簡體   English   中英

Mongodb父參考樹獲取當前位置和完整路徑

[英]Mongodb parent reference tree get current location and full path

我正在用MongoDB和Mongoose制作父母參考樹。 我的架構看起來像這樣

var NodesSchema = new Schema({
    _id: {
        type: ShortId,
        len: 7
    },
    name: { // name of the file or folder
        type: String,
        required: true
    },
    isFile: { // is the node file or folder
        type: Boolean,
        required: true
    },
    location: { // location, null for root
        type: ShortId,
        default: null
    },
    data: { // optional if isFile is true
        type: String
    }
});

請注意,文件/文件夾是可重命名的

在我當前的設置中,如果我想獲取特定文件夾中的文件,我執行以下查詢:

NodesModel.find({ location: 'LOCATION_ID' })

如果我想獲得一個文件/文件夾我運行:

NodesModel.findOne({ _id: 'ITEM_ID' })

並且位置字段看起來像f8mNslZ1但如果我想獲取位置文件夾名稱,我需要進行第二次查詢。

不幸的是,如果我想獲得root的路徑,我需要做一個遞歸查詢,如果我有300個嵌套文件夾,這可能會很慢。

所以我一直在尋找並找出以下可能的解決方案:

我應該將位置字段從字符串更改為對象,並將信息保存在其中,如下所示:

location: {
    _id: 'LOCATION_ID',
    name: 'LOCATION_NAME',
    fullpath: '/FOLDERNAME1/FOLDERNAME2'
}

此解決方案中的問題是文件/文件夾是可重命名的。 在重命名時,我應該更新所有孩子。 然而,重命名很少發生,然后索引,但如果文件夾有1000個項目,我想是一個問題。

我的問題是:

  • 我的建議是使用location對象而不是string嗎? 它可能導致什么問題?
  • 是否有更好的方法來實現這一目標?
  • 我該如何改進我的代碼?

查看您的節點架構,如果您將location屬性更改為對象,您將有2個位置來說明節點的名稱,因此請注意更新這兩個名稱屬性。 通常,您希望盡可能將數據庫保留為DRY,並且在大多數情況下,執行嵌套查詢非常常見。 話雖這么說,你比我更了解你的數據庫,如果你通過做更多的查詢看到顯着的性能延遲,那么只需確保更新所有的名稱屬性。

除此之外,如果您的位置的fullpath屬性是一個字符串,並且假設您遇到必須重命名文件夾的情況,則必須通過分解整個字符串並將子字符串與a進行比較來分析整個字符串。新文件夾名稱的新值。 這可能會變得乏味。

一種可能的解決方案是將完整路徑存儲為數組而不是字符串,將訂單作為鏈中的下一個文件夾,這樣您就可以在需要時快速進行比較和更新。

MongoDB文檔廣泛涵蓋了建模樹結構的不同方法。

你提出的方式就是其中之一。

根據預期發生文件夾重命名的頻率(和/或任何其他層次結構更改比添加新葉節點更復雜),您可以考慮將“路徑”存儲為“祖先數組”。 但無論你采用哪種方式對每個文件夾中的樹進行非規范化或具體化,那么權衡就是為了加快查找速度,你會得到更慢和/或更復雜的更新。

在你的情況下,似乎很清楚優化讀取而不是罕見的更新 - 除了頻率較低之外,似乎可以異步完成重命名,而在顯示父文件夾名稱時根本不可能。

雖然DRY在編程中是一個很好的原則,但它幾乎不適用於非關系數據庫,所以除非你使用嚴格的關系數據庫和普通形式,否則不要將它應用於你的模式設計,事實上,這將特別不鼓勵MongoDB就像你使用錯誤的工具一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM