簡體   English   中英

如何使用 MongoDb 在 NodeJS 中獲取收件箱的覆蓋用戶及其最后一條消息

[英]How to get inbox's coversation's users and its last messages in NodeJS with MongoDb

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM