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