【问题标题】:How can you drop an attribute from the database in Sails/Waterline如何从 Sails/Waterline 中的数据库中删除属性
【发布时间】:2017-01-08 06:09:44
【问题描述】:

(编辑澄清我想在从对象中删除属性时从数据库中删除/删除属性)

我有一个小型 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 从数据库中的对象中永久删除/删除属性?

【问题讨论】:

标签: javascript sails.js waterline


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    默认情况下,您不能“取消设置”属性,因为结构化 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 也可以同时用于多条记录。

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

    否则文档替换(畏缩)是前面所述的唯一其他选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      相关资源
      最近更新 更多