MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

Mongoose Node.js में संदर्भों को ध्यान में रखते हुए ऑब्जेक्ट को कैसे निकालें?

दूसरे मॉडल से उत्पाद आईडी निकालने के लिए आपको अपनी कॉलों को नेस्ट करना होगा। उदाहरण के लिए, उत्पाद . से उत्पाद को निकालने के लिए आपके कॉल में संग्रह, आप पार्टनर . से रेफरी हटाने के लिए एक और कॉल भी कर सकते हैं परिणाम कॉलबैक के भीतर मॉडल। उत्पाद को डिफ़ॉल्ट रूप से हटाने से उसके अभियान के संदर्भ निकल जाएंगे नमूना।

निम्नलिखित कोड उपरोक्त अंतर्ज्ञान को दर्शाता है:

var campSchema = require('../model/camp-schema');

router.post('/removeProduct', function (req, res) {
    campSchema.Product.findOneAndRemove({ _id: req.body.productId }, function (err, response) {
        if (err) throw err;
        campSchema.Partner.update(
            { "products": req.body.productId },
            { "$pull": { "products": req.body.productId } },
            function (err, res){
                if (err) throw err;
                res.json(res);
            }
        );
    });
});

संबद्ध अभियानों को निकालने के लिए आपको एक अतिरिक्त निकालने की कार्रवाई की आवश्यकता हो सकती है जो किसी दिए गए उत्पाद आईडी से संबंधित अभियान आईडी लेता है। निम्न गंदे हैक पर विचार करें जो संभावित रूप से आपको कॉलबैक नरक के लिए एकतरफा टिकट प्रदान कर सकता है। अगर कॉलबैक नेस्टिंग से सावधान नहीं हैं:

router.post('/removeProduct', function (req, res) {
    campSchema.Product.findOneAndRemove(
        { _id: req.body.productId }, 
        { new: true },
        function (err, product) {
            if (err) throw err;
            campSchema.Partner.update(
                { "products": req.body.productId },
                { "$pull": { "products": req.body.productId } },
                function (err, res){
                    if (err) throw err;
                    var campaignList = product.campaign
                    campSchema.Campaign.remove({ "_id": { "$in": campaignList } })
                                .exec(function (err, res){
                                    if (err) throw err;
                                    res.json(product);
                                })
                }
            );
        }
    );
});

हालांकि यह काम करता है, async/await या async का उपयोग करके उपरोक्त संभावित नुकसान से बचा जा सकता है पुस्तकालय। लेकिन सबसे पहले, आपको async मॉड्यूल, आइए इसे सेवन के उदाहरण से स्पष्ट करते हैं वे चीज़ें जिन्हें आपको Node.js के साथ करना बंद कर देना चाहिए एक पैरेंट इकाई को खोजने के लिए कॉलबैक के साथ कई ऑपरेशन, फिर माता-पिता से संबंधित चाइल्ड इकाइयाँ खोजें:

methodA(function(a){
    methodB(function(b){
        methodC(function(c){
            methodD(function(d){
                // Final callback code        
            })
        })
    })
})

async/प्रतीक्षा के साथ, आपकी कॉलों को

. के रूप में संरचित किया जाएगा
router.post('/removeProduct', async (req, res) => {
    try {
        const product = await campSchema.Product.findOneAndRemove(
            { _id: req.body.productId }, 
            { new: true }
        )

        await campSchema.Partner.update(
            { "products": req.body.productId },
            { "$pull": { "products": req.body.productId } }
        )

        await campSchema.Campaign.remove({ "_id": { "$in": product.campaign } })

        res.json(product)
    } catch(err) {
        throw err
    }
})

async मॉड्यूल के साथ, आप या तो कई विधियों के नेस्टिंग कोड के लिए कॉलबैक के उपयोग को संबोधित करने के लिए श्रृंखला पद्धति का उपयोग कर सकते हैं जिसके परिणामस्वरूप कॉलबैक हेल :

श्रृंखला :

async.series([
    function(callback){
        // code a
        callback(null, 'a')
    },
    function(callback){
        // code b
        callback(null, 'b')
    },
    function(callback){
        // code c
        callback(null, 'c')
    },
    function(callback){
        // code d
        callback(null, 'd')
    }],
    // optional callback
    function(err, results){
        // results is ['a', 'b', 'c', 'd']
        // final callback code
    }
)

या झरना :

async.waterfall([
    function(callback){
        // code a
        callback(null, 'a', 'b')
    },
    function(arg1, arg2, callback){
        // arg1 is equals 'a' and arg2 is 'b'
        // Code c
        callback(null, 'c')
    },
    function(arg1, callback){      
        // arg1 is 'c'
        // code d
        callback(null, 'd');
    }], function (err, result) {
        // result is 'd'    
    }
)

अब अपने कोड पर वापस जा रहे हैं, एसिंक वॉटरफॉल विधि का उपयोग करके आप अपने कोड को

. में पुनर्गठित कर सकते हैं
router.post('/removeProduct', function (req, res) {
    async.waterfall([
        function (callback) {
            // code a: Remove Product
            campSchema.Product.findOneAndRemove(
                { _id: req.body.productId }, 
                function (err, product) {
                    if (err) callback(err);
                    callback(null, product);
                }
            );
        },

        function (doc, callback) {
            // code b: Remove associated campaigns
            var campaignList = doc.campaign;
            campSchema.Campaign
                .remove({ "_id": { "$in": campaignList } })
                .exec(function (err, res) {
                if (err) callback(err);
                callback(null, doc);
            }
            );
        },

        function (doc, callback) {
            // code c: Remove related partner
            campSchema.Partner.update(
                { "products": doc._id },
                { "$pull": { "products": doc._id } },
                function (err, res) {
                    if (err) callback(err);
                    callback(null, doc);
                }
            );
        }
    ], function (err, result) {
        if (err) throw err;
        res.json(result);  // OUTPUT OK
    });
});



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongodb - नेस्टेड उप-दस्तावेज़ों को खोलना;

  2. MongoError:अपरिचित पाइपलाइन चरण का नाम:'$changeStream'

  3. MongoClient आयात नहीं कर सकता

  4. सिद्धांत MongoDB आईडी द्वारा खोजें

  5. dbref क्षेत्र द्वारा मोंगोडब समूह