【问题标题】:Search and update value in json file in node js在节点js中搜索和更新json文件中的值
【发布时间】:2020-12-30 13:36:12
【问题描述】:

我正在尝试在 nodejs 中创建一个键值对的数据存储,我正在尝试将 json 文件用作数据库。现在我正在尝试读取 key 的特定值并更新或删除它。

例如(虚拟数据)

{
   name: 'my name',
   no:12345,
   course : {
      name: 'cname',
      id: 'cid'
   }
}

现在我想把它改成

{
   name: 'my name',
   no:12345,
   course : {
      name: 'cname1',
      id: 'cid1'
   },
   fees: {
      primaryFee: 1000,
      donation: 100,
   }
}

甚至删除带有值的课程键。

我想到的一种方法是读取整个文件并将其存储在一个变量中(json 解析)。并更新该变量中的值并将整个数据写入文件。

但这并不高效,因为它每次更新都会读取和写入整个数据。

那么是否有任何有效的方法来更新或删除文件本身中的特定键???

【问题讨论】:

  • 如果您正在处理对文件系统上文件的大量读/写操作,您可能应该重新考虑使用文件数据源——听起来像数据库更合适? :)
  • 是的,但我正在尝试创建基于文件的数据存储以用于学习目的。这是交给我的任务,我正在努力高效地完成它

标签: javascript node.js json key-value-store


【解决方案1】:

是的,即使在像 JS 这样的高级编程语言中,也可以更新文件的一部分,尽管它通常在低级编程语言中更常见,例如C

对于node.js,查看文件系统模块的官方文档,尤其是write函数:https://nodejs.org/api/fs.html#fs_fs_write_fd_buffer_offset_length_position_callback

您的问题的其他可能解决方案:

  1. 建议使用eol 的数据库
  2. 使用仅追加文件,您只追加更新。这更有效,因为不必写入整个文件。
  3. 将您的数据库文件拆分为多个文件(这是数据库经常在表面下做的事情)

【讨论】:

  • 我查看了它,但在缓冲区中我无法将部分数据解析为 JSON 并搜索特定键,因为数据在缓冲区中作为字符串可用。感谢您提供我将来可以使用的信息。
  • 您必须阅读整个文档/文件,是的。否则,您将无法搜索密钥或将其解析为 JSON。但是一旦你阅读了它,如果你知道每个 JSON 属性在文件中的确切位置,你就可以更新它。正如您已经看到的,它变得相当复杂。您可以实现自己的 JSON 解析机制并附加到 jsonObject.property1 = blablabla 之类的文件行,然后从原始行加上所有添加的行构造 JSON 对象。这就像一个扩展/更改的键值存储。
【解决方案2】:

由于您正在处理基于文件的数据存储,您可以在 node.js 中使用 FS 来读取和写入文件。 readfilesync 回调会返回文件的全部内容,该文件应被解析为 JSON 并进行更改。

所以 AFAIK 唯一的解决方案是读取整个文件,然后更新或删除该值。在最坏的情况下,当您尝试更新或删除密钥时,您将遍历 O(n)。

【讨论】:

    【解决方案3】:

    您已经发现了为什么数据库如此复杂 ;)

    在不完全读取和解析数据、编辑然后再次写入结果的情况下更新 json 文件确实不是一个好方法。

    如果您正在寻找一个简单的文件数据库,请查看 sqlite

    【讨论】:

    • 感谢您的建议以及我们将使用 db 而不是基于简单文件的 db 的原因。通过你的回答,你是说我问的是不可能的???
    • 我不会说不可能,但你正在做的事情(完全阅读、编辑、完全写入)绝对是最能证明错误的方式。您可以编写自定义文件阅读器和解析器,但与使用 sqlite(也适用于文件)或也适用于文件的替代数据库相比,这将是一项疯狂的工作
    • 那么有另一种方法来进行特定更新??? (即使有错误或问题)。我只是在尝试探索可能性。
    • 是的,您可以读取文件的内容并自己进行更改。假设您想添加一个新密钥,您完全可以将其添加到末尾的 } 之前。但是 JSON 的一个大问题是您总是必须读取和写入整个文件(即使您自己解析数据时也是如此)。如果您想了解此类事情,我建议您研究数据库如何处理此问题:)
    • 感谢您的这种方法和建议。我将研究一些键值配对数据库机制,以便我能有所了解。谢谢???
    【解决方案4】:

    要进行这些类型的数据更改,使用数据库,对于 JSON 文件,您必须将完整数据存储在变量中并执行操作。

    【讨论】:

      猜你喜欢
      • 2021-10-23
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多