MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да насоча към масив MongoDB с AngularJS?

Тук има няколко неща, които не са страхотни, но първо трябва да покрием основите и да тръгнем напред.

Първото нещо е да коригираме метода, извикващ услугата ъглова страна. Крайната точка на API със сигурност не очаква синтаксиса за актуализиране на 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);
    });
}

Сега вашият API край на сървъра има някои недостатъци, бих предпочел тотален редизайн, но поради липса на информация, просто се концентрирам върху отстраняването на основните проблеми, без да променям много.

Ако приемем, че това е 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){

И в края на API на сървъра:

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 колекция в цикъл (Async)

  2. Запитване за обект в подмасив Mongoose

  3. Неуспешно свързване с MongoDB при използване на .NET Core, работещ на Linux

  4. Как да изтрия n-ти елемент от масива в mongodb

  5. Spring data mongodb дизайн на приложение и агрегиране на данни