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

jtl*_*sey 2 gun

当路径包含多个对象时,如何删除数据?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);
Run Code Online (Sandbox Code Playgroud)

然后我可以使用以下内容查询所有储蓄账户:

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');
Run Code Online (Sandbox Code Playgroud)

我试图删除基础上,gundb问题记录在这里维基gun.path("object3").把(空),但我不知道怎么改了我的申请.在储蓄帐户路径上,有多个储蓄帐户.因此,如果我想删除一个特定的储蓄账户,我会通过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');
Run Code Online (Sandbox Code Playgroud)

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

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

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

mar*_*dal 6

@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');
Run Code Online (Sandbox Code Playgroud)

它会奏效.为什么?因为它过滤掉任何已空的帐户.

为什么所有的空虚?

在GUN中删除工作,如Mac OSX或Windows或Linux.在nullING告诉每一个机器"在垃圾桶/回收站将这个数据." 这有用的原因是因为它可以让你改变主意去删除某些东西,所以你可以在以后随时恢复它.(恢复已删除的内容/文件很多,但大多数人都没有考虑过).

这些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');
Run Code Online (Sandbox Code Playgroud)

哪个是对的.然而,如果他然后关闭他的笔记本电脑并拿回他的手机......他会注意到他的帐户仍在那里!这不是一个好的经历.但是由于null通知,使用GUN修复这很容易:

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

现在当他们拿起手机时,它会反映出他们账户的当前状态!他们会看到它已被删除所有设备,因为它null已同步到所有设备.


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