Mongodb父引用树获取当前位置和完整路径
Posted
技术标签:
【中文标题】Mongodb父引用树获取当前位置和完整路径【英文标题】:Mongodb parent reference tree get current location and full path 【发布时间】:2015-01-16 09:53:00 【问题描述】:我正在使用 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
,但如果我想获取位置文件夹名称,我需要进行第二次查询。
不幸的是,如果我想获得根路径,我需要进行递归查询,如果我有 300 个嵌套文件夹,这可能会很慢。
所以我一直在寻找并想出了以下可能的解决方案:
我是否应该将位置字段从字符串更改为对象并将信息保存在其中:
location:
_id: 'LOCATION_ID',
name: 'LOCATION_NAME',
fullpath: '/FOLDERNAME1/FOLDERNAME2'
这个解决方案的问题是文件/文件夹是可重命名的。重命名时,我应该更新所有孩子。然而,重命名发生的次数比索引少得多,但如果文件夹有 1000 个项目,我猜这将是一个问题。
我的问题是:
我对位置对象而不是字符串的建议可行吗?可能会导致什么问题? 有没有更好的方法来实现这一点? 如何改进我的代码?【问题讨论】:
【参考方案1】:查看您的 Node Schema,如果您将 location
属性更改为一个对象,您将有 2 个地方声明节点的名称,因此请注意更新这两个名称属性。通常你想让你的数据库尽可能的干燥,并且在大多数情况下进行嵌套查询是很常见的。话虽如此,您比我更了解您的数据库,如果您发现执行更多查询导致性能显着延迟,那么请务必更新所有名称属性。
除此之外,如果您的位置的 fullpath
属性是一个字符串,并且假设您遇到了必须重命名文件夹的情况,则必须通过分解来分析整个字符串并将子字符串与新文件夹名称的新值进行比较。这可能会很乏味。
一种可能的解决方案是将完整路径存储为数组而不是字符串,将顺序作为链中的下一个文件夹,这样您就可以在需要时快速比较和更新。
【讨论】:
【参考方案2】:建模树结构的不同方法是extensively covered in the MongoDB docs。
你提议的方式就是其中之一。
根据预期文件夹重命名的频率(和/或任何其他比添加新叶节点更复杂的层次结构更改),您可能会考虑将“路径”存储为“祖先数组”。但是,无论您以何种方式对每个文件夹中的树上的路径进行非规范化或具体化,权衡是为了更快地查找,您将获得更慢和/或更复杂的更新。
在您的情况下,优化读取而不是罕见更新似乎很明显 - 除了频率较低之外,重命名似乎可以异步完成,而显示父文件夹的名称根本不可能。
虽然 DRY 是编程中的一个重要原则,但它几乎不适用于非关系型数据库,因此除非您使用严格的关系型数据库和范式,否则不要将其应用于您的架构设计,事实上这将是特别是不鼓励在 MongoDB 中使用,因为那样你会使用错误的工具来完成这项工作。
【讨论】:
文档的链接说对不起,我们找不到那个页面。 显然改成了docs.mongodb.com/manual/applications/… 其实搜索词组可以看到多页docs.mongodb.com/manual @Fusion 文档链接已修复。感谢您的提醒。以上是关于Mongodb父引用树获取当前位置和完整路径的主要内容,如果未能解决你的问题,请参考以下文章