Javascript 在节点js中搜索并更新json文件中的值

Javascript 在节点js中搜索并更新json文件中的值,javascript,node.js,json,key-value-store,Javascript,Node.js,Json,Key Value Store,我试图在nodejs中创建一个键值对数据存储,我试图在其中使用一个json文件作为数据库。现在我尝试读取key的一个特定值,并更新或删除它 例如(虚拟数据) 现在我想把它改成 { name: 'my name', no:12345, course : { name: 'cname1', id: 'cid1' }, fees: { primaryFee: 1000, donation: 100, } } 或者甚至

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

例如(虚拟数据)

现在我想把它改成

{
   name: 'my name',
   no:12345,
   course : {
      name: 'cname1',
      id: 'cid1'
   },
   fees: {
      primaryFee: 1000,
      donation: 100,
   }
}
或者甚至用它的值删除课程密钥

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

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


那么,有没有有效的方法来更新或删除文件本身中的特定密钥呢?

您已经发现了数据库如此复杂的原因;)

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


如果您正在寻找一个简单的文件数据库,请查看sqlite,了解如何更改这些类型的数据,使用DB,对于JSON文件,您必须将完整数据存储在变量中并执行操作。

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

对于node.js,请查看文件系统模块的官方文档,特别是写入功能:

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

  • 按照建议使用数据库
  • 使用仅附加更新的文件。这更有效,因为不必写入整个文件
  • 将数据库文件拆分为多个文件(这是数据库通常在表面下执行的操作)

  • 由于您使用的是基于文件的数据存储,因此可以使用node.js中的FS来读取和写入文件。readfilesync回调函数返回文件的全部内容,这些内容应被解析为JSON并进行更改


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

    如果您正在处理对文件系统上文件的大量读/写操作,您可能应该重新考虑使用文件数据源-听起来DB更合适?:)是的,但我正在尝试创建一个基于文件的数据存储,用于学习目的。这是一项交给我的任务,我正在努力有效地完成它。我需要将它保存在一个文件中。是不是有可能…谢谢你的建议,以及为什么我们要使用db而不是简单的基于文件的db。根据你的回答,你是说我所问的是不可能的吗???我不会说不可能,但你所做的(完全读取、编辑、完全写入)绝对是最防bug的方式。您可以编写一个自定义文件读取器和解析器,但与使用sqlite(也可用于文件)或替代数据库(也可用于文件)相比,这将是一个疯狂的工作量。是否有替代方法进行特定更新???(即使有bug或问题)。我只是想探索一下可能性。你当然可以阅读文件的内容,然后自己修改。如果您想添加一个新的键,您完全可以将它添加到尾随}之前的末尾。JSON的一个大问题是,您必须始终读取和写入整个文件(即使您自己在解析数据时也是如此)。如果您想了解这些事情,我建议您研究一下数据库是如何处理的:)谢谢您的这种方法和建议。我将研究一些键值对数据库机制,以便了解一些情况。谢谢,我查看了它,但在缓冲区中,我无法将部分数据解析为JSON并搜索特定的键,因为数据在缓冲区中以字符串形式提供。谢谢你提供我将来可能用到的信息。你必须阅读整个文档/文件,是的。否则,您无法搜索密钥或将其解析为JSON。但一旦读取了它,如果知道每个JSON属性在文件中的确切位置,就可以更新它。正如您已经看到的,它变得相当复杂。不过,您可以实现自己的JSON解析机制并附加到文件行中,如
    jsonObject.property1=blablablabla
    ,然后从原始的JSON对象加上所有添加的行构造JSON对象。这就像一个扩展/更改的键值存储。
    {
       name: 'my name',
       no:12345,
       course : {
          name: 'cname1',
          id: 'cid1'
       },
       fees: {
          primaryFee: 1000,
          donation: 100,
       }
    }