使用mongoDB逻辑的虚拟文件夹

时间:2013-08-16 06:09:38

标签: php mongodb

需要一点逻辑帮助。我有一个文件夹,我将通过http / php / post上传大量文件。我上传时会将它们编入MongoDB的集合中。我需要将文件组织到不同的文件夹中,实际上没有文件夹,但是当有人在查看界面时,我将把它放在一起,它看起来就像一个文件树。我还将设置虚拟文件夹的权限。我一直在思考如何将文件索引到Mongo Collection中的虚拟文件夹,我遇到的问题是为每个用户分配权限。我正在考虑索引一个文件和这样的虚拟文件夹(对不起长代码,只是试图让你知道文件树的深度):

$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很新,我想的结构太多了。

1 个答案:

答案 0 :(得分: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']
));

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