[英]How to get inbox's coversation's users and its last messages in NodeJS with MongoDb
認為您是User 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以便您可以使用$first運行$group以獲取最新的文檔
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.