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

AngularJS के साथ MongoDB सरणी को कैसे पुश करें?

यहां कुछ चीजें हैं जो बहुत अच्छी नहीं हैं, लेकिन सबसे पहले बुनियादी बातों को शामिल करना और आपको आगे बढ़ाना है।

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

$scope.saveComment = function(i){
    console.log("id is " + i);

    // Split these out so they are easy to log and debug
    var path = '/api/its' + i;

    // This must mirror the structure expected in your document for the element
    // Therefore "comments" is represented as an array of objects, even
    // where this is only one.
    var data = { 
       comments: [{ 
         words: $scope.comment,
         userId: $scope.getCurrentUser().name 
       }]
    };

    // Call service with response
    $http.put(path,data).success(function(stuff){
      document.location.reload(true);
    });
}

अब आपके सर्वर एपीआई एंड में कुछ खामियां हैं, मैं पूरी तरह से नया स्वरूप पसंद करूंगा, लेकिन जानकारी के अभाव में, बिना ज्यादा बदलाव किए मुख्य समस्याओं को ठीक करने पर ध्यान केंद्रित कर रहा हूं।

मान लें कि यह lodash है लाइब्रेरी, .merge() यहां फ़ंक्शन गलत तरीके से लागू किया गया है। यह बताया जाना चाहिए कि "मर्ज" में सरणी सामग्री को ठीक से "हैंडल" कैसे करें, और वर्तमान में जो सबसे अच्छा होगा वह "ओवरराइट" होगा। तो हम इसे कुछ स्मार्ट देते हैं:

// Updates an existing it in the DB.
exports.update = function(req, res) {
  if(req.body._id) { delete req.body._id; }
  It.findById(req.params.id, function (err, it) {
    if (err) { return handleError(res, err); }
    if(!it) { return res.send(404); }
    var updated = _.merge(it, req.body,function(a,b) {
        if (_.isArray(a)) {
            return a.concat(b);    // join source and input
        }
    });
    updated.save(function (err) {
      if (err) { return handleError(res, err); }
      return res.json(200, updated);
    });
  });
};`

लेकिन इसमें एक पकड़ है, क्योंकि यह केवल सरणी में "संलग्न" होगा। इसलिए यदि आप अपने इनपुट में कुछ डालते हैं जो पहले से मौजूद था, तो मूल आइटम और सरणी इनपुट में कुछ भी जोड़ा जाएगा।

इससे निपटना आपकी आवश्यकताओं के आधार पर काम करने के लिए एक पूरी अन्य समस्या है।

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

यह आपको अपेक्षित कार्यों के अनुसार MongoDB अपडेट फ़ंक्शन का बेहतर उपयोग करने की अनुमति देता है। तो सर्विस कॉल में कुछ ऐसा:

// comment can just be a singular object now
$http.put(path,{ 
    "words": "this that", 
    "userId": 123
}).success(function(stuff){

और सर्वर पर एपीआई अंत:

exports.addComment = function(req, res) {
  if(req.body._id) { delete req.body._id; }
  It.findByIdAndUpdate(req.params.id,
     { "$push": { "comments": req.body } },
     { "new": true },
     function(err,it) {
      if (err) { return handleError(res, err); }
      if(!it) { return res.send(404); }
      return res.json(200, it);
     }
  );
};

तो वह बस "टिप्पणी" का शरीर लेगा और इसे सरणी में जोड़ देगा। सबसे महत्वपूर्ण बात यह है कि यह "परमाणु रूप से" करता है, ताकि वर्तमान "विलय" जैसा कुछ करने में कोई अन्य संभावित अनुरोध टकरा न सके। उसी एंडपॉइंट के अन्य अनुरोध वर्तमान स्थिति में सरणी में "संलग्न" होंगे जैसे अनुरोध किया जाता है, और ऐसा ही होगा।

यही है $push ऑपरेटर के लिए है, इसलिए इसका उपयोग करना बुद्धिमानी है।

विचार के लिए कुछ खाना।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB, Express.js और Slush . के साथ पेजिनेशन लागू करना

  2. बीएसओएन स्पेक उदाहरणों की बेहतर व्याख्या?

  3. MongoDB C# ड्राइवर के साथ BsonElement विशेषता और कस्टम अक्रमांकन तर्क

  4. स्प्रिंग रिपॉजिटरी में MongoDB क्वेरी:फ़िल्टर के बाद रिकॉर्ड की संख्या सीमित करें

  5. कैसे एक मशीन पर MongoDB के साथ सर्वर विफलता पर डेटा हानि से बचने के लिए?