javascript 序列化如何检查数据库中是否存在条目

ffx8fchx  于 2022-12-21  发布在  Java
关注(0)|答案(7)|浏览(115)

我需要使用Node.js中的Sequelize检查数据库中是否存在具有特定ID的条目

function isIdUnique (id) {
    db.Profile.count({ where: { id: id } })
      .then(count => {
        if (count != 0) {
          return false;
        }
        return true;
      });
  }

我在if语句中调用了这个函数,但结果总是未定义的

if(isIdUnique(id)){...}
llew8vvj

llew8vvj1#

我不喜欢用count来检查记录是否存在,假设你有上亿条相似的记录,如果你只想得到布尔值,如果存在,那为什么要把它们都计数呢?

findOne将在存在匹配时在第一个值处完成工作。

const isIdUnique = id =>
  db.Profile.findOne({ where: { id} })
    .then(token => token !== null)
    .then(isUnique => isUnique);
bvjxkvbb

bvjxkvbb2#

**更新:**看answer which suggests using findOne() below,我个人更喜欢;然而,该答案描述了一种替代方法。

您 * 没有从isIdUnique函数返回 *:

function isIdUnique (id) {
    return db.Profile.count({ where: { id: id } })
      .then(count => {
        if (count != 0) {
          return false;
        }
        return true;
    });
}

isIdUnique(id).then(isUnique => {
    if (isUnique) {
        // ...
    }
});
ljo96ir5

ljo96ir53#

你可以数数。

Project
  .findAndCountAll({
     where: {
        title: {
          [Op.like]: 'foo%'
        }
     },
     offset: 10,
     limit: 2
  })
  .then(result => {
    console.log(result.count);
    console.log(result.rows);
  });

文档链接,v5 Beta版本

fzsnzjdm

fzsnzjdm4#

我发现the answer by @alecxe在某些情况下是不可靠的,所以我调整了逻辑:

function isIdUnique (id, done) {
  db.Profile.count({ where: { id: id } })
  .then(count => {
    return (count > 0) ? true : false
  });
}
nwnhqdif

nwnhqdif5#

因为Sequelize是围绕承诺设计的,所以alecxe's answer可能是最有意义的,但是为了提供一个替代方案,您也可以传入一个回调:

function isIdUnique (id, done) {
    db.Profile.count({ where: { id: id } })
      .then(count => {
        done(count == 0);
      });
  }
}

isIdUnique(id, function(isUnique) {
  if (isUnique) {
    // stuff
  }
});
aij0ehis

aij0ehis6#

扩展@Jalal的答案,如果您非常关注性能影响,同时维护一个简单的Sequelize结构,并且您不需要行数据,我建议您只从数据库请求一列,为什么要浪费带宽和时间要求数据库返回所有列呢?

const isIdUnique = id =>
  db.Profile.findOne({ where: { id }, attributes: ['id'] })
    .then(token => token !== null)
    .then(isUnique => isUnique);

attributes字段告诉Sequelize只从数据库请求id列,而不发送整行的内容。
同样,这可能看起来有点过分,但在大规模情况下,如果您有许多列来保存大量数据,这可能会在性能上产生巨大的差异。

7uhlpewt

7uhlpewt7#

试试下面的解决方案。我试过了,效果很好。

const isIdUnique = async (id, model) => {
    return await model.count({ where: { id: id } });
};
        
const checkExistId = await isIdUnique(idUser, User);
console.log("checkExistId: ", checkExistId);

相关问题