[Javascript] मोंगोज़ - कैसे समूह और पॉप्युलेट करने के लिए?


Answers

यहां का उपयोग करने के लिए बेहतर विकल्प है। .aggregate() , जो एक देशी कोड कार्यान्वयन है, जो .group() विधि के .group() मोंगोडीबी का समूह है, जो परिणामों को संसाधित करने के लिए जावास्क्रिप्ट इंजन का उपयोग करता है।

हालांकि .populate() जैसे तरीकों का प्रत्यक्ष रूप से समर्थन नहीं किया जाता है, और यह एक .populate() द्वारा किया जाता है क्योंकि एकत्रीकरण पाइपलाइन और अन्य विधियां सख्त रूप से उस प्रतिक्रिया को वापस नहीं करते हैं जो वर्तमान मॉडल की स्कीमा पर आधारित है। चूंकि "यह मानना" गलत होगा कि आप क्या कर रहे हैं, यह सिर्फ एक कच्चा ऑब्जेक्ट प्रतिक्रिया है।

हालांकि, कुछ भी नहीं है जो आप को "कास्टिंग" से रोकते हैं, और फिर .populate() दस्तावेजों के रूप में और फिर आवश्यक पथों के साथ .populate() के मॉडल फॉर्म को .populate() हैं:

Message.aggregate(
    [
        { "$match": { "to": user } },
        { "$sort": { "date": 1 } },
        { "$group": { 
            "_id": "from",
            "to": { "$first": "$to" },
            "message": { "$first": "$message" },
            "date": { "$first": "$date" },
            "origId": { "$first": "$_id" }
        }}
    ],
    function(err,results) {
        if (err) throw err;
        results = result.map(function(doc) { 
            doc.from = doc._id
            doc._id = doc.origId;
            delete doc.origId;
            return new Message( doc ) 
        });
        User.populate( results, { "path": "from to" }, function(err,results) {
            if (err) throw err;
            console.log( JSON.stringify( results, undefined, 4 ) );
        });
    }
)

बेशक, यह वास्तव में प्रत्येक "से" से $first संदेश देता है जैसा कि ऑपरेटर द्वारा निहित है

शायद "समूह" द्वारा वास्तव में क्या मतलब है, वास्तव में "सॉर्ट" करना है:

Message.find({ "to": user })
    .sort({ "from": 1, "date": 1 })
    .populate("from to")
    .exec(function(err,messsages) {
        if (err) throw err;
        console.log( JSON.stringify( messages, undefined, 4 ) );
    });

जैसा कि आपका संदर्भ "सभी संदेश" कहते हैं और ऐसा कुछ नहीं जो अन्यथा एक समूह ऑपरेटर द्वारा निरूपित किया जाता है जैसे कि। .aggregate() या .group() समूह विधि .group() संग्रह विधि। इसलिए संदेशों को किसी भी विशेष समूह के बजाय सॉर्टिंग के माध्यम से "एक साथ समूहीकृत" किया गया।

बाद में लगता है कि आप वास्तव में क्या पूछ रहे हैं, लेकिन अगर आप वास्तव में वास्तविक "समूह" का इरादा रखते हैं तो इसके साथ एकत्रीकरण का उदाहरण दिया गया है।

Question

मैं मोंगोडीबी और मोंगोज़ का उपयोग मेरे ओडीएम के रूप में करता हूं और मैं उसी कथन में populate और group by का प्रयोग करके एक क्वेरी बनाने की कोशिश कर रहा हूं।

यहां मेरे सरल दस्तावेज़ मॉडल हैं:

var userSchema = new Schema({
    username: String
});

var messageSchema = new Schema({
    from: { type: Schema.ObjectId, ref: 'User' },
    to: { type: Schema.ObjectId, ref: 'User' },
    message: String,
    date: { type: Date, default: Date.now }
});

मैं बस एक उपयोगकर्ता के लिए हर संदेश प्राप्त करने की कोशिश कर रहा हूं, वह प्रत्येक उपयोगकर्ता द्वारा समूह के साथ बातचीत करता है। मैंने इस तरह की कोशिश की:

this.find({ 'to': user })
    .sort({ 'date': 1 })
    .group('from')
    .populate(['from', 'to'])
    .exec(callback);

लेकिन, दुर्भाग्य से, मेरे मॉडल में group विधि नहीं है क्या आपके पास यह काम करने के लिए कोई समाधान है?

धन्यवाद।