我创建了如下消息模式:-
{
_id : message_unique_id,
recipients : [ user_id1,user_id2,user_id3 ],
message : "Hello Word",
readBy : [user_id2,user_id3],
chatId : unique_id_for_every_chat
}
现在,我能够获得每次对话的最后一条消息,但无法获得未读消息的计数。我正在使用的是如下:-
Messages.aggregate([
{ $match : {recipients : {$in : [my_user_id]},
{ $project : {
chatId : 1,
recipients : 1,
readBy : 1
}, { $group : {
_id : "$chatId",
message : "$last" : "$message"} }}]).exec();
上面的查询效果很好,并返回用户每次聊天的最后一条消息。但是现在我也想获取未读邮件数。我使用以下查询:-
Messages.aggregate([
{ $match : {recipients : {$in : [my_user_id]},
{ $project : {
chatId : 1,
recipients : 1,
readBy : 1,
unread: {
$cond: { if : { "$readBy" : {$in : [my_user_id]}}, then :
0, else : 1 }
}
},
{ $group : {
_id : "$chatId",
unreadCount : { $sum: "$unread" },
message : "$last" : "$message"} }}]).exec();
但是此查询返回null。请帮忙。
答案 0 :(得分:1)
将$ project的读取值替换为以下内容:
unread: {$cond: {
if: {$gte: [{$indexOfArray: ["$readBy", my_user_id]}, 0]}, then: 0, else: 1
}}
尝试
unread: {
$cond: {
if: {
"$setIsSubset": [
[my_user_id],
"$readBy"
]
},
then: 0,
else: 1
}
}
这对我来说很有效。