0

需要一点逻辑帮助。我有一个文件夹,我将通过 http/php/post 上传很多文件。我将在它们上传时将它们索引到 MongoDB 中的集合中。我需要将文件组织到不同的文件夹中,实际上不会有文件夹,但是当有人查看界面时,我会将其放在一起,看起来就像一棵文件树。我还将设置虚拟文件夹的权限。我一直在思考如何将文件索引到虚拟文件夹中并放入 Mongo 集合中,我遇到的困难是为每个用户分配权限。我正在考虑像这样索引文件和虚拟文件夹(对不起,代码很长,只是想让您了解文件树的深度):

$collection->insert(array(
    '_id' => new MongoID(),
    'type' => 'folder',
    'folderOrFileNameAndLocation' => 'products'
));
$collection->insert(array(
    '_id' => new MongoID(),
    'type' => 'folder',
    'folderOrFileNameAndLocation' => 'products/device'
));
$collection->insert(array(
        '_id' => new MongoID(),
        'type' => 'folder',
        'folderOrFileNameAndLocation' => 'products/device/manuals'
    ));

$collection->insert(array(
        '_id' => new MongoID(),
        'type' => 'file',
        'fileName' => 'theManual.pdf',
        'location' => 'products/device/manuals/'
    ));

我的问题是如何在添加用户时为每个用户分配文件夹权限,这就是我的想法

$collection->insert(array(
        '_id' => new MongoID(),
        'username' => 'Joe',
        'password' => '1234', //will obviously be one way hashed
        //STORE AS A STRING
        'permissibleFolders' => 'products/device/manuals/, software/latest/'
    ));

    //OR SHOULD I DO IT THIS WAY???

    $collection->insert(array(
        '_id' => new MongoID(),
        'username' => 'Joe',
        'password' => '1234', //will obviously be one way hashed
        'permissibleFolders' => array(
            //DO I HAVE TO SET A KEY FOR THIS OR CAN I JUST ADD THEM IN?
            products/device/manuals/,
            software/latest/
        )
    ));

现在通过这样做,我将如何查询分配给用户的文件夹?这就是我的想法,但是如何查询最后一部分?我可以使它与嵌套查询一起工作,但这是我尝试永远不会做的事情。

$pulledData = $collection->find(array('username' => $username, 'password' => $password));
        $doesExist = $pulledData -> count();
        if($doesExist == 1){
            logUserInAndStuff();
            foreach($pulledData as $row){
                $accessibleFolders = $row['permissibleFolders'];
            }
            //HOW DO I MAKE THIS QUERY THE PROPER FOLDERS?
            $pulledData = $collection->find(array('folderNameAndLocation'=>$accessibleFolders));

        }

抱歉,如果我的逻辑很愚蠢,我对服务器的“拉动”以及我被允许做的事情非常有限。我一无所获,并期望通过一些伟大的事情来度过难关。有人可以帮助我想出的任何更好的方法都会很棒!我对 noSQL 很陌生,我可能想太多结构了,哈哈。

4

1 回答 1

0

为什么不向每个文件系统对象添加允许用户列表

为用户添加权限很容易

db.collection.update({folderOrFileNameAndLocation : 'products'}, {$push: {allowedUsers: 'Joe'}})

删除用户很容易

db.collection.update({folderOrFileNameAndLocation : 'products'}, {$pull: {allowedUsers: 'Joe'}})

检查权限很容易

db.collection.find({folderOrFileNameAndLocation : 'products', allowedUsers : 'Joe'})

列出用户可以访问的所有内容很容易

db.collection.find({allowedUsers: 'Joe'}, {folderOrFileNameAndLocation: 1, _id: 0})

您可能会发现有用的一件事是将文件和文件夹构建为树,而不是将位置设置为字符串。所以你会有

$collection->insert(array(
    '_id' => new MongoID(),
    'type' => 'folder',
    'folderOrFileName' => 'products'
));

然后创建一个子文件夹:

$collection->find(array('folderOrFileName' => 'products'));
$collection->insert(array(
    '_id' => new MongoID(),
    'type' => 'folder',
    'folderOrFileName' => 'device',
    'parent' => $collection['_id']
));

这种结构有利有弊。根据您还需要支持什么,您可能会发现自己的方式或树方式更容易。但我肯定会建议将用户名分配给文件夹,而不是反之亦然。

于 2013-08-16T19:29:23.623 回答