Kuzzle文档更新方式正确性验证及嵌套JSON高效更新方法咨询
Kuzzle Document JSON Update: Correctness & Efficient Nested Key Updates
Is your initial JSON update approach correct?
你的代码确实能实现更新指定键的目的,但它并不是最理想的实现方式,这里有几个需要注意的点:
- 你是先拉取整个文档,修改
j00对象里的目标键后,再把整个j00对象传回执行更新。这种方式会全量替换j00对象,如果在你拉取文档到执行更新的间隙,有其他操作修改了j00里的其他键,那些修改会被你的更新直接覆盖掉——因为你传回去的是本地修改后的完整j00。 - 当
j00对象体积较大时,这种方式会浪费带宽和Kuzzle的处理资源,毕竟你只需要修改一个键,没必要把整个j00都传回去。
更高效且安全的方式是使用Kuzzle的部分更新能力,通过点符号直接指定要修改的嵌套路径,不需要替换整个j00对象。修改后的代码示例:
kuzzle_doc = await get_kuzzle_doc(i,c,d); current_value = kuzzle_doc._source.j00[key_to_modify]; new_value = modify(current_value); try { const response = await kuzzle.document.update( i, c, d, // 直接通过点路径指定要更新的目标键 { [`j00.${key_to_modify}`]: new_value } ); console.log('response',response); } catch (error) { console.error("await kuzzle.document.update ....", error); }
这种方式只会更新j00下的指定键,不会影响其他键,同时传输的数据量更小,性能更优,还能降低并发更新的冲突风险。
Efficient way to update keys in nested JSON structures
对于像{ 'a': 'dsds', 'b': 'rer', 'c': 'yytyh hgvhg', 'd': 'koo kllkl vv', 'e': {} }这样的嵌套结构,Kuzzle同样支持用点符号路径直接更新嵌套键,不需要拉取整个嵌套对象,甚至不需要拉取整个文档(如果你不需要基于旧值修改的话)。
举几个实用例子:
- 直接给
e添加/更新键f:
await kuzzle.document.update(i, c, d, { "e.f": "new_value" });
- 需要基于
e.f的旧值修改时,推荐只拉取需要的字段(减少数据传输),修改后再用点路径更新:
// 只拉取e.f字段,避免获取整个文档 const doc = await kuzzle.document.get(i, c, d, { fields: ["e.f"] }); const old_val = doc._source.e.f; const new_val = modify(old_val); await kuzzle.document.update(i, c, d, { "e.f": new_val });
这种点路径的方式是Kuzzle更新嵌套键最高效的方案,它避免了全量替换嵌套对象,既节省资源又降低了冲突概率。
内容的提问来源于stack exchange,提问作者ibstelix
相关产品推荐
相关产品推荐

