使用文件系统目录和文件的极简 JSON 数据库

dev-main 2021-08-30 00:12 UTC

This package is auto-updated.

Last update: 2024-09-29 05:56:37 UTC


README

使用文件系统目录和文件的极简 JSON 数据库

目前处于开发中

最近 ... 闲暇时间在处理更重要的周末项目时随意完成的;-)

composer update

概念

我们忽略了文件系统中信息是以文件、文件夹和在这种情况下 JSON 键组织的事实。相反,我们将所有内容处理为一个大的逻辑信息树。文件和文件夹名称是层级键,在 JSON 文件中作为 JSON 键继续。

信息通过 `hierarchical.key` 访问。库将负责加载所需的内容。

因此,我们无需处理信息的组织方式,只需使用它。如果您保存新的信息,库将使用标准行为来确定保存的位置(见下文)。如果您想自己控制文件系统的结构,您只需创建一些文件夹和空 JSON 文件即可。库将使用现有文件。使用方式非常直观:$data = $db->query('things.some_thing')

读取

写入

save() 将给定的键分割成部分,例如 `folder.part.file-part.json.part`。它将寻找可能已经包含数据的现有文件夹和文件。行为如下:

注释

  • (1) 如果它有更多键,这些键将被用作 JSON 键
  • (2) 类似 JavaScript:对象是一个具有字符串键的数组,数组是一个具有数字键的数组
  • (3) 如果您想将一些键用作 JSON 键,请首先调用 ensureFolder() 任务或 ensureFile()?
  • (4) 如果您想将数组分割成多个文件,请使用循环并多次调用 `->save()`

开发

  • 我们有删除文件的功能吗?或者只是文件夹?

用法

$db = new JsonDB('some/db');

$data = $db->query('things.some.thing')

  ->filter( fn($v, $k) => floatval($v['price']) < 50.0 )
  ->sort( fn($a, $b) => // uses uasort()
      $a['price'] == $b['price'] ? 0 :
      $a['price'] <  $b['price'] ? -1 : 1
    )
  ->get();

foreach( $data as $rec )
  var_dump( $rec );

// Save

$db->save('0.someval', 'myval');

// Join stuff: a join is just a loop joining 2 arrays

替代方案: https://sleekdb.github.iohttps://github.com/Lazer-Database/Lazer-Database

高级

也许 ...

  • 当一个文件包含数组并且我们保存 obj 时,我们可能需要以某种方式解决这个问题
  • get('first') get(idx) 保存一些方法:没有 first()
  • save('first') save(idx)
  • delete('last') delete(idx)
  • 我们可以添加一个方法,它返回一个查询信息的“子数据库”,该数据库可以再次进行过滤,例如在循环中
  • 完成 delete()
  • 添加更多文件类型,重命名项目 - 从此开始
    • 纯文本也是可以通过键访问的数据
    • yml 文件
    • md 文件
    • 图像
    • ...
  • 也许实现 has()
  • 也许还应该在 my/folder/* 时加载子文件夹

这目前是未定义的行为

  • 仅包含 JSON 子键的文件夹可能意味着删除所有文件(文件没有子键,只有文件夹)

许可证

版权 (C) Walter A. Jablonowski 2021,MIT 许可证

请参阅 credits 了解用于示例中的第三方软件的许可证。

隐私 | 法律