MongoDB中两个集合的查询

问题描述 投票:0回答:1

我正在尝试找到MongoDB的出路。这是我第一次使用来自MySQL的数据库。但是对于我正在制作的聊天应用程序,建议使用MongoDB作为更合适的选择。

我有两个收藏夹:

对话,其中存储成员userID(存储在MySQL数据库中)和加入日期。

{
    "_id" : ObjectId("5e35f2c840713a43aeeeb3d9"),
    "members" : [ 
        {
            "uID" : "1",
            "j" : 1580580922
        }, 
        {
            "uID" : "4",
            "j" : 1580580922
        }, 
        {
            "uID" : "5",
            "j" : 1580580922
        }
    ]
}

消息,其中存储发件人(用户ID),消息,时间戳,对话ID(来自上面的集合),已读取和已传送状态

{
    "_id" : ObjectId("5e35ee5f40713a43aeeeb1c5"),
    "c_ID" : ObjectId("5e35f2c840713a43aeeeb3d9"),
    "fromID" : "1",
    "msg" : "What's up?",
    "t" : 1580591922,
    "d" : {
        "4" : 1580592039
    },
    "r" : {
        "4" : 1580592339
    }
}

我现在要做的是查询特定用户的对话,比如说用户ID 1,以及该对话中发送的最后一条消息。

我想到了以下内容:

db.getCollection('conversations').aggregate(
[{
    $match: {
        "members.uID": "1"
    }
},
{
    $lookup: {
        as: 'lastMessage',
        foreignField: 'c_ID',
        from: 'messages',
        localField: '_id',
    }
},
])

但是这里的问题是,它列出了所有消息,而不仅仅是最后一条消息。因此,我想将此限制为1,或者是否有其他方法。请让我知道。

感谢您的任何帮助!

mongodb mongodb-query
1个回答
0
投票

我想最后一条消息与时间戳有关。

如果可以,则可以使用以下聚合:

db.conversations.aggregate([
  {
    $match: {
      "members.uID": "1"
    }
  },
  {
    $lookup: {
      foreignField: "c_ID",
      from: "messages",
      localField: "_id",
      as: "messages"
    }
  },
  {
    "$unwind": "$messages"
  },
  {
    "$sort": {
      "messages.t": -1
    }
  },
  {
    "$group": {
      "_id": "$_id",
      "lastMessage": {
        "$first": "$messages"
      },
      "allFields": {
        "$first": "$$ROOT"
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$mergeObjects": [
          "$allFields",
          {
            "lastMessage": "$lastMessage"
          }
        ]
      }
    }
  }
])

Playground

© www.soinside.com 2019 - 2024. All rights reserved.