MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment construire une requête pour mettre à jour le document de tableau imbriqué dans mongo?

L'opérateur positionnel ne fonctionne pas sur le nombre de niveaux sur lesquels vous essayez de le faire fonctionner ( https://jira.mongodb.org/browse/SERVER-831?focusedCommentId=22438&page=com.atlassian.jira.plugin.system. issuetabpanels%3Acomment-tabpanel ) avec menus.$.items.$.name et même si c'était le cas, l'analyseur de requête MongoDB n'aurait aucune idée de ce que l'autre $ provient de la find de la update .

Vous devrez extraire les éléments du schéma, les mettre à jour séparément, puis mettre à jour le document racine.

Une bonne façon de juger quand les requêtes doivent être effectuées séparément est de penser que chaque menu sonne comme une entité distincte (ou une table dans une base de données relationnelle) en tant que tel, vous devriez probablement travailler sur la mise à jour de ces entités (ou tables dans un modèle relationnel) séparément pour l'entité parent (table).

Donc, vous devez d'abord sortir le document racine principal. Faites défiler ses menus côté client, puis $set ce menu particulier à l'ensemble de l'élément que vous créez côté client.

Modifier

La façon dont j'imagine ce travail côté client est (en pseudo-code puisque mon Java est un peu rouillé) en obtenant d'abord ce document sous forme d'enregistrement actif :

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

Ensuite, vous parcourriez le document en attribuant vos valeurs :

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"
        }
    }
}

Et puis enregistrez simplement le document une fois toutes les modifications validées :

db.col.save(doc);

Ce n'est bien sûr qu'une façon de le faire et cette façon utilise le paradigme de l'enregistrement actif que j'aime personnellement. Dans cette idée, vous combineriez la recherche avec tout ce que vous devez modifier sur le document, en le construisant côté client, puis en l'envoyant en une seule requête à votre base de données.