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

Поддокумент за намиране/актуализиране на Mongoose

Така че, както отбелязвате, по подразбиране в mongoose е, че когато „вградите“ данни в масив като този, получавате _id стойност за всеки запис в масива като част от неговите собствени свойства на поддокумента. Всъщност можете да използвате тази стойност, за да определите индекса на елемента, който възнамерявате да актуализирате. Начинът на MongoDB за това е позиционният $ операторна променлива, която държи "съвпадащата" позиция в масива:

Folder.findOneAndUpdate(
    { "_id": folderId, "permissions._id": permission._id },
    { 
        "$set": {
            "permissions.$": permission
        }
    },
    function(err,doc) {

    }
);

Това .findOneAndUpdate() метод ще върне модифицирания документ или в противен случай можете просто да използвате .update() като метод, ако не се нуждаете от връщане на документа. Основните части са "съпоставяне" на елемента от масива за актуализиране и "идентифициране", които съвпадат с позиционния $ както бе споменато по-рано.

Тогава, разбира се, използвате $set оператор, така че само елементите, които посочите, всъщност се изпращат "по проводника" към сървъра. Можете да продължите с това с „точкова нотация“ и просто да посочите елементите, които всъщност искате да актуализирате. Като в:

Folder.findOneAndUpdate(
    { "_id": folderId, "permissions._id": permission._id },
    { 
        "$set": {
            "permissions.$.role": permission.role
        }
    },
    function(err,doc) {

    }
);

Така че това е гъвкавостта, която MongoDB предоставя, където можете да бъдете много „насочени“ в това как всъщност актуализирате документ.

Това, което прави обаче, е „заобикаляне“ на всяка логика, която може да сте вградили във вашата „мангустова“ схема, като например „валидиране“ или други „кукички за предварително записване“. Това е така, защото "оптималният" начин е "характеристика" на MongoDB и как е проектирана. Самият Mongoose се опитва да бъде "удобна" обвивка на тази логика. Но ако сте готови сами да поемете контрола, тогава актуализациите могат да бъдат направени по най-оптималния начин.

Така че, където е възможно да направите това, пазете данните си „вградени“ и не използвайте референтни модели. Позволява атомарната актуализация както на "родителски", така и на "детски" елементи в прости актуализации, където не е нужно да се притеснявате за едновременност. Вероятно е една от причините да сте избрали MongoDB на първо място.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да търся обект по неговия ObjectId в mongo конзолата?

  2. MongoDB C# Заявка за 'Like' на низ

  3. MongoDB $dateToParts

  4. Получаване на времеви печат на unix за секунди от MongoDB ISODate по време на агрегиране

  5. Mongodb concat int и низ