3

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

// 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 问题和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 指向 null ,当我再次列出所有储蓄账户时,queryMultiple('saving_accounts');我得到一个cannot read property name of null.

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

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

4

1 回答 1

7

@jtlindsey 好问题!尽管关于如何删除数据,即使关于如何删除列表/集合/表中的项目,您都是正确的。但这里是如何获得你想要的结果:

快速解决方案:

将您的查询更改为:

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。ing 告诉每台机器“将null这些数据放入垃圾箱/回收站”。这很有用的原因是因为它可以让您改变对删除某些内容的想法,因此您可以稍后根据需要恢复它。(恢复已删除的内容/文件经常发生,但大多数人都没有想到)。

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

例子

想象一下,您的用户正在他的手机上查看网站,并意识到他需要解决一些稍微复杂一些的问题,因此他使用笔记本电脑登录。在检查了笔记本电脑上的详细信息后,他决定删除该帐户。在他的“点击”动作下面会导致你的运行代码运行:

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

deletebyID('saving_accounts', 'FesxPaup8gzuNSsLFlWXMKaL');

哪个是对的。但是,如果他随后关闭笔记本电脑并重新拿起手机……他会注意到他的帐户仍然存在!这不是一个好的体验。但是使用 GUN 修复这很容易,因为null通知:

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

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


那有意义吗?这是你回答你的问题吗?需要其他帮助吗?与往常一样,https://gitter.im/amark/gunhttps://github.com/amark/gun/wiki/deletehttp://gun.js.org/

于 2016-08-02T21:45:34.090 回答