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

Mongodb met à jour un sous-document profondément imbriqué

Malheureusement, vous ne pouvez pas utiliser le $ opérateur plus d'une fois par clé, vous devez donc utiliser des valeurs numériques pour le reste. Comme dans :

db.myCollection.update({
    "id": 1, 
    "forecasts.forecast-id": 123, 
    "forecasts.levels.level": "proven", 
    "forecasts.levels.configs.config": "Custom 1"
  },
  {"$set": {"forecasts.$.levels.0.configs.0": newData}}
)

La prise en charge de MongoDB pour la mise à jour des tableaux imbriqués est médiocre. Il est donc préférable d'éviter leur utilisation si vous avez besoin de mettre à jour les données fréquemment, et envisagez plutôt d'utiliser plusieurs collections.

Une possibilité :faire des forecasts sa propre collection, et en supposant que vous avez un ensemble fixe de level valeurs, faites level un objet au lieu d'un tableau :

{
  _id: 123,
  parentId: 1,
  name: "Forecast 1", 
  levels: {
    proven: { 
      configs: [
        { 
          config: "Custom 1",
          variables: [{ x: 1, y:2, z:3}]
        }, 
        { 
          config: "Custom 2",
          variables: [{ x: 10, y:20, z:30}]
        }, 
      ]
    },
    likely: {
      configs: [
        { 
          config: "Custom 1",
          variables: [{ x: 1, y:2, z:3}]
        }, 
        { 
          config: "Custom 2",
          variables: [{ x: 10, y:20, z:30}]
        }, 
      ]
    }
  }
}

Ensuite, vous pouvez le mettre à jour en utilisant :

db.myCollection.update({
    _id: 123,
    'levels.proven.configs.config': 'Custom 1'
  },
  { $set: { 'levels.proven.configs.$': newData }}
)