NodeJS 查找对话在sequelize findOne中不起作用

bfrts1fy  于 2023-04-11  发布在  Node.js
关注(0)|答案(2)|浏览(141)

几天来,我一直在努力寻找使用Sequelize的两个用户之间是否存在对话。我有conversationmessageuseruserConversations之间的关系。下面是一个表的外观:

这是我的userConversations表,我想要的是找到是否有2个或x个用户之间的现有会话。
下面是关系和查询:

db.conversations.hasMany(db.messages, {
  foreignKey: 'conversationId',
});
db.messages.belongsTo(db.conversations);

db.conversations.belongsToMany(db.users, { through: db.userConversations });
db.users.belongsToMany(db.conversations, { through: db.userConversations });

db.conversations.hasMany(db.userConversations, {
  foreignKey: 'conversationId',
});
db.userConversations.belongsTo(db.conversations);

db.messages.belongsTo(db.users, { as: 'sender' });

下面是NOT工作查询,我想要的是检查是否存在针对给定用户ID(如[2,3][1,3][x, y, ...])的现有转换

let conversationDB = await db.conversations.findOne({
    include: [
      {
        model: db.userConversations,
        where: { userId: { [Op.in]: [2, 3] } }, <=== HARDCODED [2,3] for the example
      },
  });

以下是我不同意的结果:

{
   "id": 5,
   "userConversations": [
       {
           "id": 8,
           "conversationId": 5,
           "userId": 2
       }
   ]
}

我期望严格匹配[2, 3],所以我期望严格有两个条目,这是我想要的

{
    "id": 5,
    "userConversations": [
        {
            "id": 9,
            "conversationId": 6,
            "userId": 2
        },
        {
            "id": 10,
            "conversationId": 6,
            "userId": 3
        }
    ]
}

也试过这个但不起作用

let conversationDB = await db.conversations.findOne({
    include: [
      {
        model: db.userConversations,
        where: { userId: { 2 } },
      },
      {
        model: db.userConversations,
        where: { userId: 3 },
      },
    ],
    group: ['conversations.id'],
    having: Sequelize.literal('COUNT(DISTINCT userConversations.userId) = 2'),
  });

任何提示或想法将是如此有帮助,有一个美好的一天。

js5cn81o

js5cn81o1#

从SQL中可以为数据模型提供一个简单的聚合方法。
逻辑是针对用户a、B、c,如果我们有一个计数为3的对话,那么对话存在于他们之间。

select count(conversationId), userId, conversationId where userId in (1,2,3) group by conversationId having count(conversationId) = 3

因此,使用此方法,您可以反向查找对话对象。
比如

models.userConversations.findAll({
    attributes: ['userId', 'conversationId', [Sequelize.fn('COUNT', Sequelize.col('conversationId')), 'conversationCount']],
    include: [
    {
        model: models.conversations,
        attributes: []
    }],
    where: { userId: { [Op.in]: [2, 3] } },
    group: ['conversationId'],
    having: { conversationCount: 2 }
});

我在Sequelize有点生疏,所以不知道语法是否会100%工作。如果它不工作,你找到正确的语法注解,我会编辑答案。

nmpmafwu

nmpmafwu2#

这是我第一次没有任何错误,但现在除了[]之外什么都没有返回。

let conversationDB = await db.userConversations.findAll({
    attributes: [
      'conversationId',
      [Sequelize.fn('COUNT', Sequelize.col('conversationId')), 'conversationCount'],
    ],
    include: [
      {
        model: db.conversations,
        attributes: [],
      },
    ],
    where: { userId: { [Op.in]: [1, 2] } },
    group: ['conversationId'],
    having: Sequelize.literal('count(conversation.id) = 2'),
  });

下面是用户userConversations表:

相关问题