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

时间:2016-08-02 15:24:45

标签: 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);

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

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问题herewiki 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

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

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

1 个答案:

答案 0 :(得分: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');

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

为什么所有的空缺?

删除GUN工作,如Mac OSX或Windows或Linux。 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');

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

,使用GUN修复这很容易
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/delete以及http://gun.js.org/