Documento de atualização do MongoDB (atualizar elementos no objeto array)

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

Acho que você gosta

Origin blog.csdn.net/m1729339749/article/details/132268979
Recomendado
Clasificación