[英]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
屬性更改為對象,您將有2個位置來說明節點的名稱,因此請注意更新這兩個名稱屬性。 通常,您希望盡可能將數據庫保留為DRY,並且在大多數情況下,執行嵌套查詢非常常見。 話雖這么說,你比我更了解你的數據庫,如果你通過做更多的查詢看到顯着的性能延遲,那么只需確保更新所有的名稱屬性。
除此之外,如果您的位置的fullpath
屬性是一個字符串,並且假設您遇到必須重命名文件夾的情況,則必須通過分解整個字符串並將子字符串與a進行比較來分析整個字符串。新文件夾名稱的新值。 這可能會變得乏味。
一種可能的解決方案是將完整路徑存儲為數組而不是字符串,將訂單作為鏈中的下一個文件夾,這樣您就可以在需要時快速進行比較和更新。
MongoDB文檔廣泛涵蓋了建模樹結構的不同方法。
你提出的方式就是其中之一。
根據預期發生文件夾重命名的頻率(和/或任何其他層次結構更改比添加新葉節點更復雜),您可以考慮將“路徑”存儲為“祖先數組”。 但無論你采用哪種方式對每個文件夾中的樹進行非規范化或具體化,那么權衡就是為了加快查找速度,你會得到更慢和/或更復雜的更新。
在你的情況下,似乎很清楚優化讀取而不是罕見的更新 - 除了頻率較低之外,似乎可以異步完成重命名,而在顯示父文件夾名稱時根本不可能。
雖然DRY在編程中是一個很好的原則,但它幾乎不適用於非關系數據庫,所以除非你使用嚴格的關系數據庫和普通形式,否則不要將它應用於你的模式設計,事實上,這將特別不鼓勵MongoDB就像你使用錯誤的工具一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.