我正在尝试找到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,或者是否有其他方法。请让我知道。
感谢您的任何帮助!
我想最后一条消息与时间戳有关。
如果可以,则可以使用以下聚合:
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"
}
]
}
}
}
])