(已编辑以澄清我想从对象中删除/删除数据时从数据库删除)
我有一个带有无模式模型的小型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永久删除/删除数据库中对象的属性?
答案 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/
否则,文档替换(附加)是如上所述的唯一其他选择。