【问题标题】:Sequelizejs, how sort field values when creating an indexSequelizejs,创建索引时如何对字段值进行排序
【发布时间】:2017-01-28 04:11:46
【问题描述】:

我有一些“邀请”模型:

'use strict';

export default function (sequelize, DataTypes) {
  return sequelize.define('Invite', {
      userFromId: {
        type: DataTypes.INTEGER,
        modal: 'User',
        key: '_id',
        onDelete: 'cascade'
      },
      userToId: {
        type: DataTypes.INTEGER,
        modal: 'User',
        key: '_id',
        onDelete: 'cascade'
      },
      accept1: {
        type: DataTypes.BOOLEAN,
        defaultValue: false
      },
      accept2: {
        type: DataTypes.BOOLEAN,
        defaultValue: false
      }

    },{
      indexes: [
        {
          name:'id',
          unique: true,
          fields: ['userFromId','userToId'],
        }]
    }
  );
}

当我创建一个新的“邀请”时,无论谁被邀请,“userFromId”和“userToId”的组合都会创建一个索引。例如邀请{userFromId:1,userToId:2}{userFromId:2,userToId:1} 必须具有相同的索引。

我使用 sequelize:3.29.0 和 mysql。

【问题讨论】:

    标签: mysql node.js sequelize.js


    【解决方案1】:

    这是不可能使用数据库索引的,因为[1, 2] != [2, 1]。如果您想强制执行这种类型的唯一性,一个选项是创建一个具有唯一索引的新字段并将其值设置为 lower + : + higher,以便在上面的示例中您始终以 1:2 结束。

    // Create a field called 'uniqueKey' set to the sorted IDs
    export default function (sequelize, DataTypes) {
      return sequelize.define('Invite', {
          // ... other fields
          uniqueKey: {
            type: DataTypes.String,
            allowNull: false,
            defaultValue: function() {
               // create an array of the IDs, sort, then join with :
               return [
                   this.getDataValue('userFromId'),
                   this.getDataValue('userToId'),
               ].sort().join(':');
            },
          },
          // ... other fields
        },{
          indexes: [
            {
              name:'uniqueKey',
              unique: true,
              fields: ['uniqueKey'],
            }]
        }
      );
    }
    

    你可以在这里看到defualtValue是如何计算的,无论ID的顺序如何,key/result都是一样的:

    [1,2].sort().join(':');
    "1:2"
    [2,1].sort().join(':');
    "1:2"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多