2017-05-07 76 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 
        } 
       ] 
      }, 
     ], 
    } 
相關問題