【问题标题】:mongoose how can I get the last message for each conversation猫鼬我怎样才能得到每个对话的最后一条消息
【发布时间】:2021-05-15 20:16:04
【问题描述】:

我有以下消息架构,我想查询用户的所有对话。

我想对会话列表和消息使用相同的方案。(我试图将它们分开,但它不起作用。)我想要做的就是能够获取聊天列表。

最后一条消息和您正在与之发送消息的消息。

const messengerScheme = mongoose.Schema({ 
    users:[{
        type: mongoose.Schema.Types.ObjectId,
        ref:'User'
    }],
    from:{
        type: mongoose.Schema.Types.ObjectId, 
        ref: 'User'
    },
    message:{
        type:String,
    },
    hasImage:{
        type:Boolean,
    },
    image:{
        type:String
    }
})

假设两个用户进行如下对话:

/* 1 */
{
    "_id" : ObjectId("609ee8c7593cda1de475cfff"),
    "users" : [ 
        ObjectId("60841c75b6c2a522047d1988"), 
        ObjectId("6084036ad4d4cd40a47afba4")
    ],
    "from" : ObjectId("60841c75b6c2a522047d1988"),
    "message" : "Hiiii",
    "hasImage" : false,
    "createdAt" : ISODate("2021-05-14T21:16:55.318Z"),
    "updatedAt" : ISODate("2021-05-14T21:16:55.318Z"),
    "__v" : 0
}

/* 2 */
{
    "_id" : ObjectId("609ee8e5593cda1de475d000"),
    "users" : [ 
        ObjectId("6084036ad4d4cd40a47afba4"), 
        ObjectId("60841c75b6c2a522047d1988")
    ],
    "from" : ObjectId("6084036ad4d4cd40a47afba4"),
    "message" : "hiiii !",
    "hasImage" : false,
    "createdAt" : ISODate("2021-05-14T21:17:25.723Z"),
    "updatedAt" : ISODate("2021-05-14T21:17:25.723Z"),
    "__v" : 0
}

/* 3 */
{
    "_id" : ObjectId("609ee8ec593cda1de475d001"),
    "users" : [ 
        ObjectId("6084036ad4d4cd40a47afba4"), 
        ObjectId("60841c75b6c2a522047d1988")
    ],
    "from" : ObjectId("6084036ad4d4cd40a47afba4"),
    "message" : "how are you ?",
    "hasImage" : false,
    "createdAt" : ISODate("2021-05-14T21:17:32.686Z"),
    "updatedAt" : ISODate("2021-05-14T21:17:32.686Z"),
    "__v" : 0
}

/* 4 */
{
    "_id" : ObjectId("609ee90b593cda1de475d002"),
    "users" : [ 
        ObjectId("60841c75b6c2a522047d1988"), 
        ObjectId("6084036ad4d4cd40a47afba4")
    ],
    "from" : ObjectId("60841c75b6c2a522047d1988"),
    "message" : "I am pretty fine, what about you ?",
    "hasImage" : false,
    "createdAt" : ISODate("2021-05-14T21:18:03.224Z"),
    "updatedAt" : ISODate("2021-05-14T21:18:03.224Z"),
    "__v" : 0
}

当我使用用户 ID“6084036ad4d4cd40a47afba4”进行查询时,我只想获取最后一条消息并填充用户个人资料

【问题讨论】:

    标签: node.js mongodb mongoose aggregation-framework


    【解决方案1】:
    • $match 用户 ID 和 users
    • $sort updatedAt 按降序排列
    • $limit 结果中有 1 条消息
    db.collection.aggregate([
      { $match: { users: ObjectId("6084036ad4d4cd40a47afba4") } },
      { $sort: { updatedAt: -1 } },
      { $limit: 1 }
    ])
    

    Playground


    对话明智的最新单条消息:

    • $match 用户 ID 和 users
    • $sort updatedAt 按降序排列
    • $setUnionusers 进行排序
    • $group 由上面的users 排序得到第一个根文档
    db.collection.aggregate([
      { $match: { users: ObjectId("6084036ad4d4cd40a47afba4") } },
      { $sort: { updatedAt: -1 } },
      {
        $group: {
          _id: { $setUnion: "$users" },
          message: { $first: "$$ROOT" }
        }
      }
    ])
    

    Playground

    【讨论】:

    • 它工作得很好,但我想要的与它生成的结果有点不同,这返回了两个用户 ObjectId("60841c75b6c2a522047d1988") 和 ObjectId("6084036ad4d4cd40a47afba4) 之间对话的最后一条消息") ,我还想返回我们用户的其他对话的最后一条消息,假设我们的用户 ObjectId("6084036ad4d4cd40a47afba4") 也与用户 ObjectId("60841d03f6ccad2b0400f619") 有类似的对话,它应该返回该对话的最后一条消息太
    • 如何判断用户对话?
    • 我尝试使用另一个名为会话的集合,其中两个用户发生在一个数组中,但当时我无法在每个会话中获取最后一条消息,const conversationScheme = mongoose.Schema({ users:[{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }], time:{ type:Date, default:Date.now() }, })
    • 所以我想也许我可以直接从messages方案中获取对话列表,并且可以从中获取最新的消息
    • 我认为这不是通过users 数组确定对话的好方法,例如:当一条消息具有users: [1 ,2] 而第二条消息具有users: [2,1] 时,两者的值不同, $group 会认为这两个值不同。
    猜你喜欢
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2016-11-03
    • 1970-01-01
    • 2013-03-28
    相关资源
    最近更新 更多