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

我正在用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进行比较来分析整个字符串.新文件夹名称的新值.这可能会变得乏味.

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

上一篇:javascript – 不能将.push()子文件转换成Mongoose数组


下一篇:javascript – KeystoneJS – 创建新项目会引发重复键错误