MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongodb aktualisiert tief verschachteltes Filialdokument

Leider können Sie den $ nicht verwenden Operator mehr als einmal pro Taste, also müssen Sie für den Rest numerische Werte verwenden. Wie in:

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

Die Unterstützung von MongoDB für die Aktualisierung verschachtelter Arrays ist schlecht. Sie sollten ihre Verwendung also am besten vermeiden, wenn Sie die Daten häufig aktualisieren müssen, und stattdessen mehrere Sammlungen verwenden.

Eine Möglichkeit:forecasts erstellen seine eigene Sammlung, und vorausgesetzt, Sie haben einen festen Satz von level Werte, machen level ein Objekt anstelle eines Arrays:

{
  _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}]
        }, 
      ]
    }
  }
}

Dann können Sie es aktualisieren mit:

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