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

Как да конструирам заявка за актуализиране на документ с вложен масив в mongo?

Позиционният оператор не работи на броя нива, на които се опитвате да го накарате да работи ( https://jira.mongodb.org/browse/SERVER-831?focusedCommentId=22438&page=com.atlassian.jira.plugin.system. issuetabpanels%3Acomment-tabpanel ) с menus.$.items.$.name и дори да го направи, синтактичният анализатор на заявки MongoDB няма да има представа какво означава другият $ е от find на update .

Ще трябва да извадите елементите от схемата, да ги актуализирате отделно и след това да актуализирате основния документ.

Един добър начин да прецените кога заявките трябва да се извършват отделно е да мислите, че всяко меню звучи като отделен обект (или таблица в релационна база данни), като такъв вероятно трябва да работите върху актуализирането на тези обекти (или таблици в релационен модел) отделно до родителския обект (таблица).

Така че първо трябва да извадите главния основен документ. Превъртете през неговите менюта от страната на клиента и след това $set това конкретно меню към целия елемент, който създавате от страна на клиента.

Редактиране

Начинът, по който си представям тази работна клиентска страна, е (в псевдо код, тъй като моята Java е малко ръждясала), като първо получа този документ по начин на активен запис:

doc = db.col.find({ "_id" : { "$oid" : "506e9e54a4e8f51423679428"} , 
    "menus._id" : { "$oid" : "506e9e5aa4e8f51423679429"}});

След това ще преминете през документа, задавайки вашите стойности:

foreach(doc.menus as menu_key => menu){
    foreach(menu['items'] as key => item){
        if(item._id ==  { "$oid" : "506e9f07a4e8f5142367942f"}){
            doc.menus[menu_key][key][name] = "xcvxc66666"
        }
    }
}

И след това просто запишете документа, след като всички промени са ангажирани:

db.col.save(doc);

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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. spring-mongo-1.0.xsd грешка

  2. Поставете Pandas Dataframe в mongodb с помощта на PyMongo

  3. MongoDB Capped Collection не премахва документи

  4. невалидна байтова последователност в US-ASCII (Ruby 1.9 + rails 2.3.8 + mongodb + mongo_mapper)

  5. Свържете се с множество mongo db хостове и се удостоверете с помощта на различна база данни при пролетно зареждане