需要一点逻辑帮助。我有一个文件夹,我将通过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很新,我想的结构太多了。
答案 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']
));
这种结构有利有弊;根据您需要支持的其他内容,您可能会更容易找到自己的方式或树状方式。但我肯定会建议将用户名分配给文件夹而不是反之亦然。