【问题标题】:Add array element if it's not contained already如果尚未包含数组元素,则添加它
【发布时间】:2018-07-17 01:38:35
【问题描述】:

如果数组中不存在整数,我正在尝试将整数添加到数组中。但以下创建重复值:

User.update(
{
    'topics': sequelize.fn('array_append', sequelize.col('topics'), topicId),
},
{where: {uuid: id}})

PostgreSQL/sequelize 中是否有与 MongoDB $addToSet 等效的函数?

【问题讨论】:

    标签: arrays node.js mongodb postgresql sequelize.js


    【解决方案1】:

    引用MongoDB Manual

    $addToSet 运算符将一个值添加到数组中,除非该值已经存在,在这种情况下,$addToSet 不会对该数组执行任何操作。

    此 SQL 命令执行您所要求的操作:

    UPDATE "user"
    SET    topics = topics || topicId
    WHERE  uuid = id
    AND    NOT (topics @> ARRAY[topicId]);
    

    @> 在这种情况下,数组包含运算符和|| 数组到元素的连接。 Details in the manual here.

    相关:

    不适用于 NULL 值。在这种情况下,请考虑:array_position(topics, topicId) IS NULL。见:

    可以把它包装成一个简单的函数:

    CREATE OR REPLACE FUNCTION f_array_append_uniq (anyarray, anyelement)
      RETURNS anyarray LANGUAGE sql IMMUTABLE AS
     'SELECT CASE WHEN array_position($1,$2) IS NULL THEN $1 || $2 ELSE $1 END;'
    

    并像这样使用它:

    ...
    SET    topics = f_array_append_uniq (topics, topicId)
    ...
    

    但函数本质上不如添加WHERE 条件。如果列值实际发生变化,顶部的查询只会写入新的行版本。见:

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,我就是这样解决的。

      const user = User.findOne({where: {id}})
      User.update({topics: (user.topics.indexOf('topicId') > -1) ? user.topics : Sequelize.fn('array_append', Sequelize.col('topics'), topicId) }, {where: {id}})
      

      虽然感觉肯定有更好的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-08
        • 2018-02-25
        • 1970-01-01
        • 2011-02-22
        • 1970-01-01
        • 2020-02-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多