sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongodb uppdaterar djupt kapslade underdokument

Tyvärr kan du inte använda $ operatör mer än en gång per nyckel, så du måste använda numeriska värden för resten. Som i:

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

MongoDB:s stöd för uppdatering av kapslade arrayer är dåligt. Så det är bäst att du undviker att de används om du behöver uppdatera data ofta och överväga att använda flera samlingar istället.

En möjlighet:gör forecasts sin egen samling, och förutsatt att du har en fast uppsättning level värden, gör level ett objekt istället för en array:

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

Sedan kan du uppdatera den med:

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


  1. $addFields när ingen $match hittades

  2. Mungos befolkar kapslad array

  3. Hur kan jag lagra tid på dagen i MongoDB? Som ett snöre? Ge godtyckligt år/månad/dag?

  4. MongoDB deleteOne()