【发布时间】:2017-05-23 13:21:03
【问题描述】:
我正在制作一个应用内消息系统,我必须在其中显示对话列表以及他们的最后一条消息和未读计数。我的架构如下--
var schema = new Schema({
senderID: {
type: Schema.Types.ObjectId,
ref: 'Member'
},
receiversID: [{
type: Schema.Types.ObjectId,
ref: 'Member'
}],
content: {
type: String,
default: ''
},
isRead: {
type: Boolean,
default: false,
},
createdAt: {
type: Number,
default: Date.now
}
});
我最初这样做是为了得到他们最后一条消息的所有对话——
messageModel.aggregate(
[{ $match: { senderID: userId } },
{ $unwind: '$receiversID' },
{ $sort: { createdAt: -1 } },
{ $group: { _id: '$receiversID', unreadCount: { $sum: { $cond: [{ $eq: ["$isRead", false] }, 1, 0] } }, senderID: { $first: '$senderID' }, receiversID: { $first: '$receiversID' }, content: { $first: '$content' } } },
{ $skip: pagingData.pageSize * (pagingData.pageIndex - 1) },
{ $limit: pagingData.pageSize }
], function (err, docs) {
resolve(docs);
}
);
但如果您是接收者,它不会显示消息。无论您是接收者还是发送者,我都想显示对话。
【问题讨论】:
-
类似
{ $match: { $or:[{senderID: userId }, {receiversID: userId }] } } -
@Veeram 是的,我这样做了,但这会导致重复对话。意思是,任何两个人之间应该有一个对话,但它显示了多条记录,一条作为发送者,另一条作为接收者。
标签: node.js mongodb mongoose mongoose-schema