Antes, introduzimos como atualizar o documento e apresentamos brevemente que, ao atualizar o documento, você pode usar opções para especificar que, quando o conteúdo da atualização não existe, você pode adicionar um novo documento. Para detalhes, consulte:
Documento de atualização do MongoDB (atualizar um documento) https://blog.csdn.net/m1729339749/article/details/129983304
encontrou recentemente um requisito de que o documento contém um objeto array, que precisa ser atualizado filtrando elementos no objeto array que atender às condições .
1. Prepare os dados
Adicione dois lotes de dados do produto ao lote
db.batch.insertMany([
{ "_id": 1, "foods": [
{ "name": "苹果", "total": "20" },
{ "name": "可口可乐", "total": "30" },
{ "name": "北京方便面", "total": "10" }
]
},
{ "_id": 2, "foods": [
{ "name": "伊利纯牛奶", "total": "5" },
{ "name": "可口可乐", "total": "20" },
{ "name": "营养快线", "total": "20" }
]
},
]);
Dois, arrayFilters
gramática:
db.collection.updateOne(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string> // Available starting in MongoDB 4.2.1
}
)
Dentre eles, arrayFilters é utilizado para filtrar os elementos do objeto array.
Exemplo: encontre o elemento cujo número de nutrientes expressos é 20 e atualize o número para 30
(1) Consultar os documentos com 20 linhas expressas de nutrição
db.batch.find(
{
"foods.name": "营养快线",
"foods.total": "20"
}
)
O resultado da consulta é o seguinte:
{
"_id" : 2,
"foods" : [
{
"name" : "伊利纯牛奶",
"total" : "5"
},
{
"name" : "可口可乐",
"total" : "20"
},
{
"name" : "营养快线",
"total" : "20"
}
]
}
(2) Modifique o número de linhas expressas de nutrição
db.batch.updateOne(
{
"foods.name": "营养快线",
"foods.total": "20"
},
{
"$set": { "foods.$[element].total": "30" }
},
{
"arrayFilters": [
{
"element.name": "营养快线",
"element.total": "20"
}
]
}
)
em,
arrayFilters: representa a filtragem dos elementos na matriz e a execução de uma operação de atualização após localizar os elementos na matriz que atendem às condições.
$[element]: representa o filtro localizador, que é usado para localizar cada elemento do array.
Após a realização da operação, os elementos do array serão modificados, e o documento modificado é o seguinte:
{
"_id" : 1,
"foods" : [
{
"name" : "苹果",
"total" : "20"
},
{
"name" : "可口可乐",
"total" : "30"
},
{
"name" : "北京方便面",
"total" : "10"
}
]
}
{
"_id" : 2,
"foods" : [
{
"name" : "伊利纯牛奶",
"total" : "5"
},
{
"name" : "可口可乐",
"total" : "20"
},
{
"name" : "营养快线",
"total" : "30"
}
]
}
Pode ser visto no documento que o número de linhas express de nutrição foi modificado para 30