如何解决MongoDB对消息传递应用程序的聚合查询
我正在开发一个具有消息功能(聊天)的应用程序,我想获得我拥有的或已向我发送消息的所有用户,并按最近联系最多的联系人的顺序将所有这些用户分组到达顶部。 并计算了我从其他用户那里收到的尚未阅读的所有邮件。
Mongo消息模型
const userChat = new Schema({
senderUserId: {
type: Schema.Types.ObjectId,ref: "User"
},message: {
type: String
},room: {
type: Array
},files: {
type: Array
},read: {
type: Boolean,default: false
},receiverUserId: {
type: Schema.Types.ObjectId,ref: "User"
}
},{
timestamps: true
})
我的MongoDB汇总
const user = await UserChat.aggregate([{
$match: {
$and: [{
$or: [{
receiverUserId: req.user._id
},// User is in recepients
{
senderUserId: req.user._id
},// or the sender
],},],{
$sort: {
createdAt: -1,{
// if the message is send by me then i group the "$receiverUserId"
// if not that mean i am the receiver so i group the "$senderUserId"
$group: {
_id: {
$cond: {
if: {
$eq: ["$senderUserId",req.user._id]
},then: "$receiverUserId",else: "$senderUserId"
}
},count: {
$sum: {
$cond: ["$read",1]
},createdAt: {
$first: "$createdAt",$lookup: {
from: "users",localField: "_id",foreignField: "_id",as: "user",{
$sort: {
createdAt: -1,{
$project: {
_id: 1,count: 1,createdAt: 1,user: 1,]);
我想要获取的数据示例
例如,我们有两个用户互相写信。 用户1叫 Papi Johnson ,另一个叫米歇尔王子。米歇尔王子向 Papi johnson 发送了两条消息。 由于Papi johnson尚未阅读Michel Prince的消息,因此当Papi johnson要求他发送或接收的消息时,结果应为:
{
_id: 5f8cf7e3c68dd730b5edb8a9,// the ID of Prince Michel
count: 2,// number of message unread send by Prince Michel to Papi johnson
createdAt: 2020-10-19T02:27:39.759Z,// the last message receive
user: [ [Object] ] // in then the user info of Prince Michel
}
米歇尔王子请求发送或接收他发送的消息时,结果应为:
{
_id: 5f8cf8f5b76f3e3d5e6e249f,// the ID of Papi johnson
count: 0,// number of message unread send by Papi johnson to Prince Michel
createdAt: 2020-10-19T02:27:39.759Z,user: [ [Object] ]// in then the user info of Papi johnson
}
这是我收到的结果:
照片示例
response received on example Papi and Prince
**问题是两个用户收到的未读邮件数量相同。 我认为问题可能出在“ $ group”和“ $ sum”查询中,不仅仅计算用户收到的未读消息,而是用户发送或接收的所有未读消息。 自从我在这个级别写博客以来已经有10天了,我不知道该怎么做。 **
当Papi johnson请求发送或接收的消息时,结果为:
{
_id: 5f8cf7e3c68dd730b5edb8a9,// I think here the "$ group" and "$ sum"
//query does not count only unread message received by the user,// but rather all unread message that is sent or received by the user.
createdAt: 2020-10-19T02:27:39.759Z,// the last message receive
user: [ [Object] ] // in then the user info of Prince Michel
}
米歇尔王子请求发送或接收他发送的消息时,结果是:
{
_id: 5f8cf8f5b76f3e3d5e6e249f,// the ID of Papi johnson
count: 2,user: [ [Object] ]// in then the user info of Papi johnson
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。