如何获得针对每个用户猫鼬的未读邮件计数

时间:2019-05-01 19:47:56

标签: node.js mongoose

我想从用户集合中选择用户列表,如果用户的未读消息在消息架构中的状态为0 / false,则也选择未读消息计数,该计数可以为0/5/10/1/0。预先感谢您!我确信可以使用聚合框架来完成它,并且已经尝试了一些查询(如下),但是我没有得到所需的结果。

//User Schema 
import mongoose from 'mongoose';

const userSchema = new mongoose.Schema({
 name: { type: String, required: true, trim: true },
 email:{type: String, required: true, unique: true, minlength: 3, trim: true},
 password: { type: String, required: true, minlength: 6, trim: true },
});

   export default mongoose.model('user', userSchema);

//Message Schema
import mongoose from 'mongoose';

const messageSchema = new mongoose.Schema({
    from: { type: mongoose.Schema.Types.ObjectId, ref: 'user' },
    to: { type: mongoose.Schema.Types.ObjectId, ref: 'user' },
    text: { type: String, trim: true },
    unread: { type: Boolean, default: false }
});
messageSchema.set('timestamps', true);

export default mongoose.model('message', messageSchema);

我希望结果应该是

[ { _id: 5cc984981fa38539f4a61ce0,
     name: 'Jhon Doe',
     unreadTotal: 5 },

   { _id: 5cc98f651fa38539f4a61cfd,
    name: 'Markas',
     unreadTotal: 3 },

   { _id: 5cc994b164745026c4e25546,
     name: 'Mike',
    unreadTotal: 0 } ]


   // i tried the following but getting unread of total not for each user
    const userId = 'loggedinUserId'
    const userList = await User.aggregate([
            {
                $match: { _id: {$ne: ObjectId(userId) } }
            },
            { $lookup: 
                {
                    from: 'messages',
                    let: { 'to': ObjectId(userId) },
                    pipeline: [
                        { 
                            $match: 
                            {
                                'unread': false,
                                $expr: { $eq: [ '$$to', '$to' ] }
                            }
                        },
                        { $count: 'count' }
                    ],
                    as: 'messages'    
                }
            },
            { 
                $addFields: 
                {
                    'unreadTotal': { $sum: '$messages.count' }
                }
            }
          ]);

1 个答案:

答案 0 :(得分:0)

不确定这是否对您有帮助,但是您会像描述的那样,将每个用户的所有未读消息与登录的用户相对,然后您可以用count等来做任何您想做的事情。

const userList = await User.aggregate([
            {
                $match: { _id: {$ne: ObjectId(userId) } }
            },
            { 
                $lookup: 
                {
                    from: 'messages',
                    localField: '_id',
                    foreignField: 'from',
                    as: 'messages'
                },
            },
            {
                $project: 
                {
                    name: 1,
                    email: 1,
                    profilePhoto: 1,
                    messages: 
                    { 
                        $filter: 
                        { 
                            input: "$messages", 
                            as: "message", 
                            cond: { 
                                $and: [
                                    { $eq: [ '$$message.unread', false ] },
                                    { $eq: [ '$$message.to', ObjectId(userId) ] }
                                ]
                            }
                        }
                    }
                }
            }
        ]);