gpt4 book ai didi

mongodb - 在mongodb中查找所有未读的对话

转载 作者:行者123 更新时间:2023-12-04 09:33:27 25 4
gpt4 key购买 nike

我正在使用 Mongoose 制作群聊对话模式,但过去几天我在查询时遇到了问题。我的目标是找到用户的所有未读对话。
我的架构如下所示:

const ConversationSchema = new Schema(
{
participants: [{
user: mongoose.Schema.Types.ObjectId,
lastViewed: Date, // the last date the user checked the conversation
}],
updatedAt: Date,
}
);
这是简化的样本数据:
   {
participants: [
{
user: 'A',
lastViewed: 'Jan 11'
},
{
user: 'B',
lastViewed: 'Jan 13'
},
],
updatedAt: 'Jan 13',
}
对我来说,如果出现以下情况,用户的对话将被视为未读:
  • 用户在参与者数组
  • 和谈话updatedAt值大于参与者的 lastViewed值(value)

  • 最后,我的 Mongoose 查找功能如下所示
    const conversations = await conversationModel.find({
    'participants.user': user.id,
    $expr: {
    $gt: ['updatedAt', 'participants.user.lastViewed'],
    },
    });
    因此,当我尝试查询用户 B 的未读对话时,我应该期待一个空的 []结果为 Jan 13 = Jan 13但我仍然在结果中进行对话。我认为问题出在 $expr参数,但我不确定在处理数组时要添加什么。任何帮助将不胜感激。

    最佳答案

    您需要在 $expr 内使用美元符号引用字段时,但这不会解决您的问题。问题是您正在尝试查找特定用户,因此可能会出现用户 A 的情况。存在但 lastViewed其他用户低于 updatedAt (单独的条件)。
    最好用$let$filter首先找到您的用户,然后在该特定子文档上应用您的条件:

    db.collection.find({
    $expr: {
    $let: {
    vars: { user: { $arrayElemAt: [ { $filter: { input: "$participants", cond: { $eq: [ "$$this.user", "A" ] } } }, 0 ] }},
    in: {
    $and: [
    { $ne: [ "$$user", null ] },
    { $gt: [ "$updatedAt", "$$user.lastViewed" ] }
    ]
    }
    }
    }
    })
    Mongo Playground
    我还建议将您的日期从字符串转换为 ISODate 格式以避免任何问题,例如 Jan 13对比 Jan 9比较。

    关于mongodb - 在mongodb中查找所有未读的对话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62712782/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com