gpt4 book ai didi

node.js - 如何使用 MongoDb 在 NodeJS 中获取收件箱的 session 用户及其最后消息

转载 作者:太空宇宙 更新时间:2023-11-03 23:58:36 24 4
gpt4 key购买 nike

MongoDb 用户集合

<小时/>

认为您是用户 1。在收件箱页面中,我想获取对话的最后一条消息。我可能会发送最后一条消息或接收来自用户的最后一条消息。最后一条消息将显示在收件箱中,如下所示:

查询结果应该是这样的

[
{
"_id": "user2",
"username": "user2",
"lastMessage": "3"
},
{
"_id": "user3",
"username": "user3",
"lastMessage": "2"
}
]

MongoDb 上的用户 1 文档

{
"_id" : ObjectId("user1"),
"username" : "user1",
"inbox" : [
{
"from" : {
"user" : {
"id" : ObjectId("user2")
}
},
"message" : "1",
"received_at" : ISODate("2019-04-27")
},
{
"from" : {
"user" : {
"id" : ObjectId("user3")
}
},
"message" : "2",
"received_at" : ISODate("2019-05-1")
}
]
}

MongoDb 上的用户 2 文档

{
"_id" : ObjectId("user2"),
"username" : "user2",
"inbox" : [
{
"from" : {
"user" : {
"id" : ObjectId("user1")
}
},
"message" : "3",
"received_at" : ISODate("2019-04-29")
}
]
}

MongoDb 上的用户 3 文档

{
"_id" : ObjectId("user3"),
"username" : "user3",
"inbox" : [
{
"from" : {
"user" : {
"id" : ObjectId("user1")
}
},
"message" : "4",
"received_at" : ISODate("2019-04-30")
}
]
}
<小时/>

我必须使用什么查询来解决这个问题?

最佳答案

您可以使用以下聚合:

db.col.aggregate([
{
$unwind: "$inbox"
},
{
$addFields: {
participants: [ "$_id", "$inbox.from.user.id" ]
}
},
{
$match: { participants: "user1" }
},
{
$addFields: {
participants: {
$filter: {
input: "$participants",
cond: {
$ne: [ "$$this", "user1" ]
}
}
}
}
},
{
$unwind: "$participants"
},
{
$sort: { "inbox.received_at": -1 }
},
{
$group: {
_id: "$participants",
lastMessage: { $first: "$inbox.message" }
}
}
])

这里的挑战是您需要分析一个可能包含例如 [user1, user2] 或 [user2, user1] 的数组,并且两者都应被视为相同的分组键。

为此,您可以引入 participants 数组来过滤掉所有不属于 user1 的消息,然后从该数组中删除 user1 (使用 $filter ),以便您可以按第二个用户进行分组。

重点是你运行 $unwind获取每条消息的单个文档,然后 $sort这样你就可以运行 $group$first获取最新的

Mongo Playground

关于node.js - 如何使用 MongoDb 在 NodeJS 中获取收件箱的 session 用户及其最后消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55873885/

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