gpt4 book ai didi

javascript - Mongodb父引用树获取当前位置和完整路径

转载 作者:可可西里 更新时间:2023-11-01 09:27:08 25 4
gpt4 key购买 nike

我正在使用 MongoDB 和 Mongoose 制作 parent 引用树。我的架构看起来像这样

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'
}

此解决方案中的问题是文件/文件夹是可重命名的。在重命名时我应该更新所有的 child 。然而,重命名比索引更罕见,但如果文件夹有 1000 个项目,我想这将是一个问题。

我的问题是:

  • 我对位置对象而不是字符串的建议是否可行?它可能会导致什么问题?
  • 有没有更好的方法来实现这一点?
  • 如何改进我的代码?

最佳答案

查看您的节点模式,如果您将 location 属性更改为一个对象,您将有 2 个地方声明节点的名称,因此请注意更新两个名称属性。通常你想让你的数据库尽可能的干,在大多数情况下做嵌套查询是很常见的。话虽这么说,您比我更了解您的数据库,如果您发现执行更多查询导致性能显着延迟,那么请务必更新所有名称属性。

除此之外,如果您的位置的 fullpath 属性是一个字符串,假设您遇到必须重命名文件夹的情况,则必须分析整个分解字符串并将子字符串与新文件夹名称的新值进行比较。这可能会很乏味。

一个可能的解决方案是将完整路径存储为数组而不是字符串,顺序为链中的下一个文件夹,这样您就可以在需要时快速比较和更新。

关于javascript - Mongodb父引用树获取当前位置和完整路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27007367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com