Как обновить внутренний самый вложенный ключ в MongoDB

#mongodb #mongodb-query #aggregation-framework

Вопрос:

У меня есть следующие документы:

Документ 1:

 { 
    "ARCM Sum" : {
        "MCA Go" : "60", 
        "Assess" : "5030", 
        "ActivitID" : "467144" 
        "Activity Checks" : [
            {
                "Frequency within Activity Description matches Activity Frequency" : "Exception", 
                "Activity Description contains > 20 word" : "Pass"
            }
        ]
       
        "Week" : "04-05-2021", 
        "Load Datetime" : "07-14-2021"
    }
}
 

Документ 2:

 { 
    "ARCM Sum" : {
        "MCA Go" : "60", 
        "Assess" : "5030", 
        "ActivitID" : "467144" 
        "Activity Checks" : [
            {
                "Frequency within Activity Description matches Activity Frequency" : "Exception", 
                "Activity Description contains > 20 words" : "Pass"
            }
        ]
       
        "Week" : "04-05-2021", 
        "Load Datetime" : "07-14-2021"
    }
}
 

Мне нужно обновить документ с «word» до «word» в разделе «Описание действия содержит > 20 слов» , поэтому

например, в документе 1 есть «Описание действия содержит > 20 слов», необходимо обновить до «Описание действия содержит >> 20 слов».

Документ 2 будет проигнорирован, так как в нем уже есть слова в разделе «Описание действия содержит > 20 слов».

Ответ №1:

Обычно вы бы использовали $rename , но поскольку это поле в массиве, вы не можете сделать это напрямую. Здесь вы можете использовать обновление с конвейером агрегирования, который сопоставляет соответствующие документы:

Это доступно с момента обновления MongoDB 4.2 с конвейером агрегации

 db.test.update(
  { "ARCM Sum.Activity Checks.Activity Description contains > 20 word": {"$exists": true} },
  [{
    "$set": {
      "ARCM Sum.Activity Checks": {
        "$map": {
          "input": "$ARCM Sum.Activity Checks",
          "in": {
            "Frequency within Activity Description matches Activity Frequency": "$this.Frequency within Activity Description matches Activity Frequency",
            "Activity Description contains > 20 words": "$this.Activity Description contains > 20 word"
          }
        }
      }
    }
  }],
  { multi: true }
)