当路径有多个对象时,如何删除 gun DB 中的数据

How do I delete data in gun DB when path has multiple objects

当我的路径包含多个对象时,如何删除数据? gun.path('saving_accounts').put(null) 将删除所有储蓄账户。 或者,在迭代具有 'deleted' 对象的数据时,您是否有办法处理空错误?我正在提供完整的示例来帮助回答。假设我用这个创建枪支数据:

// localStorage.clear();
var gun = Gun();

////////////////////////////////////////////////////////////////// create record

var saving1 = gun.put({
    name: "Bank of America",
    accType: "Saving",
    last4: "5555",
    favorite: true,
    status: true,
    created: "some date created"
  });

var saving2 = gun.put({
    name: "Bank of America",
    accType: "Saving",
    last4: "4123",
    favorite: true,
    status: true,
    created: "some date created"
  });

var saving_accounts = gun.get('saving_accounts')
saving_accounts.set(saving1);
saving_accounts.set(saving2);

然后我可以用这样的东西查询所有储蓄账户:

const queryMultiple = (data_path) => {
  console.log("Query for: " + data_path);
  gun.get(data_path).map().val((name, ID) => {
    // console.log(ID);
    console.log(name.name, name.accType, ID);
  });
};
queryMultiple('saving_accounts');

我试图根据 gundb 问题 here and wiki gun.path('object3').put(null) 删除一条记录,但我不确定如何为我的应用程序更改它。在储蓄账户路径上,有多个储蓄账户。所以如果我想删除一个特定的储蓄账户,我会通过 id 删除它,但我认为我做错了。假设我要删除的帐户 ID 是 FesxPaup8gzuNSsLFlWXMKaL:

// delete record
const deletebyID = (data_path, qID) => {
    console.log("DELETE record");
    gun.get(data_path).path(qID).put(null);
};

deletebyID('saving_accounts', 'FesxPaup8gzuNSsLFlWXMKaL');

但是上面的 .put(null) 会使对象 FesxPaup8gzuNSsLFlWXMKaL 指向空,当我用 queryMultiple('saving_accounts'); 再次列出所有储蓄账户时,我得到 cannot read property name of null.

当我的路径包含多个对象时,如何删除数据?

旁注:最终我会在每个储蓄账户下嵌套一个储蓄账户的多笔交易,因此在删除错误进行的账户交易时我将不得不做同样的事情。也希望当我删除一个储蓄账户时,它会自动 deletes/nulls 所有这些账户交易,但我还没有忘记在第一层玩数据。

@jtlindsey 好问题!尽管关于如何删除数据,甚至关于如何删除 list/collection/table 中的项目,您都是正确的。但这里是如何获得你想要的结果:

快速解决方案:

将您的查询更改为:

const queryMultiple = (data_path) => {
  console.log("Query for: " + data_path);
  gun.get(data_path).map().val((name, ID) => {
    if(!name){ return }
    // console.log(ID);
    console.log(name.name, name.accType, ID);
  });
};
queryMultiple('saving_accounts');

它会起作用的。为什么?因为它会过滤掉任何无效的帐户。

为什么都是空值?

GUN 中的删除工作类似于 Mac OSX 或 Windows 或 Linux。 nulling 告诉每台机器 "Put this data in the trash/recycle bin"。这很有用的原因是因为它可以让您改变主意删除某些内容,因此您可以在以后根据需要恢复它。 (恢复已删除的 content/files 经常发生,但大多数人都没有考虑过)。

null 数据对于通知也很有用!这在您设计前端网站和渲染时非常适用 HTML。让我们来看一个简单的例子:

例子

假设您的用户正在他的 phone 上查看网站,并意识到他需要解决一些稍微复杂一点的问题,因此他使用笔记本电脑登录。在查看笔记本电脑上的详细信息后,他决定删除该帐户。在他的 "click" 操作下,您的 运行 代码变为 运行:

// delete record
const deletebyID = (data_path, qID) => {
    console.log("DELETE record");
    gun.get(data_path).path(qID).put(null);
};

deletebyID('saving_accounts', 'FesxPaup8gzuNSsLFlWXMKaL');

这是正确的。但是,如果他随后关闭他的笔记本电脑并选择他的 phone 备份...他会发现他的帐户仍然存在!!!这不是一个好的体验。但是使用 GUN 修复这很容易,因为 null 通知:

gun.get(data_path).map().on((account, ID) => {
  var UI = $("#account-" + ID);
  if(!account){
    UI.remove();
    return;
  }
  updateUI(ID, account);
});

现在,当他们拿起 phone 时,它会反映出他们帐户的当前状态!他们会看到它已在所有设备上删除,因为 null 已同步到所有设备。


这有意义吗?这是否回答了您的问题?需要其他帮助吗?一如既往,https://gitter.im/amark/gun and https://github.com/amark/gun/wiki/delete and http://gun.js.org/ .