2017-05-07 60 views
0

我正在制作一个应用消息传递系统,在该系统中我必须显示其最后一条消息和未读计数的对话列表。我的模式是follows--获取对话的最后一条消息和未读的计数

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); 
      } 
     ); 

不过,这并不表示这些消息,如果你是一个接收器。我想显示对话,无论你是接收者还是发送者。

+0

像'{$比赛:{$或:[{senderID:用户id},{receiversID:用户id}]}}' – Veeram

+0

@Veeram是的,我做到了,但会导致重复的对话。意思是,在任何两个人之间应该有一次对话,但是它显示多个记录,1作为发送者,另一个作为接收者。 –

回答

0

我用这样的:

{ 
     '$or': [ 
      { 
       '$and': [ 
        { 
         'receiversID': userId 
        }, { 
         'senderID': toUserId 
        } 
       ] 
      }, { 
       '$and': [ 
        { 
         'receiversID': toUserId 
        }, { 
         'senderID': userId 
        } 
       ] 
      }, 
     ], 
    } 
相关问题