मैं उपयोगकर्ता संग्रह से उपयोगकर्ता सूची का चयन करना चाहता हूं और यदि उपयोगकर्ता के पास एक अपठित संदेश है जो संदेश स्कीमा में स्थिति 0/झूठी है तो अपठित संदेशों की संख्या भी चुनें, जो 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' }
                }
            }
          ]);
0
Basheer Nawab 1 मई 2019, 22:47

1 उत्तर

सबसे बढ़िया उत्तर

सुनिश्चित नहीं है कि यह आपकी मदद करेगा या नहीं, लेकिन आपको लॉग इन उपयोगकर्ता के खिलाफ प्रत्येक उपयोगकर्ता के सभी अपठित संदेश मिलेंगे जैसा आपने वर्णन किया है और बाद में आप जो कुछ भी चाहते हैं वह गिनती आदि के साथ कर सकते हैं।

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

0
Alamgir Khan 3 मई 2019, 16:28