在节点 js 的 json 文件中搜索并更新值
Search and update value in json file in node js
我试图在 nodejs 中创建一个键值对数据存储,我试图在其中使用 json 文件作为数据库。现在我正在尝试读取键的特定值并更新或删除它。
例如(虚拟数据)
{
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 已解析)。并更新该变量中的值并将整个数据写入文件。
但这并不高效,因为它每次更新时都会读取和写入整个数据。
那么有什么有效的方法可以更新或删除文件本身中的特定键吗???
您已经发现为什么数据库如此复杂 ;)
如果不完全读取和解析数据、编辑然后再次写入结果,就没有真正更新 json 文件的好方法。
如果您正在寻找一个简单的文件数据库,请查看 sqlite
要更改这些类型的数据,请使用 DB,对于 JSON 文件,您必须将完整数据存储在变量中并执行操作。
是的,即使在像 JS 这样的高级编程语言中,也可以更新文件的一部分,尽管它通常在低级编程语言中更常见,例如C
对于node.js,查看文件系统模块的官方文档,特别是write函数:https://nodejs.org/api/fs.html#fs_fs_write_fd_buffer_offset_length_position_callback
您的问题的其他可能解决方案:
- 按照eol的建议使用数据库
- 使用仅附加文件,您只在其中附加更新。这样效率更高,因为不必写入整个文件。
- 将您的数据库文件拆分成几个文件(这是数据库在表面下经常做的事情)
由于您正在处理基于文件的数据存储,因此您可以在 node.js 中使用 FS 来读取和写入文件。 readfilesync 回调 returns 您应该将文件的全部内容解析为 JSON 并进行更改。
所以 AFAIK 唯一的解决方案是读取整个文件,然后更新或删除值。在最坏的情况下,当您尝试更新或删除密钥时,您将遍历 O(n)。
我试图在 nodejs 中创建一个键值对数据存储,我试图在其中使用 json 文件作为数据库。现在我正在尝试读取键的特定值并更新或删除它。
例如(虚拟数据)
{
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 已解析)。并更新该变量中的值并将整个数据写入文件。
但这并不高效,因为它每次更新时都会读取和写入整个数据。
那么有什么有效的方法可以更新或删除文件本身中的特定键吗???
您已经发现为什么数据库如此复杂 ;)
如果不完全读取和解析数据、编辑然后再次写入结果,就没有真正更新 json 文件的好方法。
如果您正在寻找一个简单的文件数据库,请查看 sqlite
要更改这些类型的数据,请使用 DB,对于 JSON 文件,您必须将完整数据存储在变量中并执行操作。
是的,即使在像 JS 这样的高级编程语言中,也可以更新文件的一部分,尽管它通常在低级编程语言中更常见,例如C
对于node.js,查看文件系统模块的官方文档,特别是write函数:https://nodejs.org/api/fs.html#fs_fs_write_fd_buffer_offset_length_position_callback
您的问题的其他可能解决方案:
- 按照eol的建议使用数据库
- 使用仅附加文件,您只在其中附加更新。这样效率更高,因为不必写入整个文件。
- 将您的数据库文件拆分成几个文件(这是数据库在表面下经常做的事情)
由于您正在处理基于文件的数据存储,因此您可以在 node.js 中使用 FS 来读取和写入文件。 readfilesync 回调 returns 您应该将文件的全部内容解析为 JSON 并进行更改。
所以 AFAIK 唯一的解决方案是读取整个文件,然后更新或删除值。在最坏的情况下,当您尝试更新或删除密钥时,您将遍历 O(n)。