如何从Sails / Waterline中的数据库中删除属性

时间:2017-01-08 06:09:44

标签: javascript sails.js waterline

(已编辑以澄清我想从对象中删除/删除数据时从数据库删除)

我有一个带有无模式模型的小型Sails应用程序,它允许添加属性并保存到数据库中(当前只是sails-disk文件系统适配器用于测试目的。)

我遇到的问题是我无法找到永久删除数据库属性的方法。

当我删除作为模型实例的对象的属性时,我也希望从数据库中删除该属性。当我移动到像MongoDB这样的对象数据库并且具有动态创建属性的对象时,这将非常有用。

使用delete object[attributeName]删除属性,然后使用实例方法object.save()保存不起作用,删除的属性仍然存在。

例如,如果我有这个对象:

{
  "name": "Chair",
  "colour": "white"
}

我想说我要删除colour属性,将其替换为material属性,如下所示:

{
  "name": "Chair",
  "material": "pine"
}

更新数据库中的对象后,会添加新的material属性,但不会删除已删除的colour属性。 所以数据库的最终结果将是:

{
  "name": "Chair",
  "colour": "white",
  "material": "pine"
}

所以这不是我追求的结果。

有没有办法使用Sails / Waterline永久删除/删除数据库中对象的属性?

2 个答案:

答案 0 :(得分:2)

我确定为时已晚,但是我遇到了同样的问题。我所做的只是创建一个新对象并删除旧对象。如果要以编程方式执行此操作,只需将当前对象和旧对象的键进行比较。问题在于您还必须使用新的ID更新所有相关的模型(和集合)。

答案 1 :(得分:0)

默认情况下,您无法“取消设置”属性,因为结构化的SQL数据库无法正常工作。您可以将属性设置为NULL,这是使用直接SailsJS最多可以执行的操作。在诸如MySql,MSSQL,Oracle,PGSQL之类的结构化数据库中,当您不提供属性时,该数据库将插入默认值(模式定义为NULL或其他规定的值)或向您抛出错误。

对于像Mongo这样的NoSQL DB,它们确实具有“未设置”选项,Sails不支持开箱即用。在Sails中,您将不得不使用sails.model [“ name”]。getDatastore()。manager进行本地查询,然后使用$ unset来运行本地Mongo更新查询以删除该属性。

const db = sails.model["products"].getDatastore().manager;
await db.collection("products").update(
       { sku: "unknown" },
       { $unset: { quantity: "", instock: "" } });

** updateMany也可以同时用于多个记录。

ref:https://docs.mongodb.com/manual/reference/operator/update/unset/

否则,文档替换(附加)是如上所述的唯一其他选择。