1. Visão geral
Neste tutorial, apresentaremos como inserir documentos em uma matriz no MongoDB. Além disso, veremos várias aplicações de $push e $addToset operadores para adicionar valores em uma matriz.
Primeiro, criaremos um banco de dados de amostra, uma coleção e inseriremos dados fictícios nele. Além disso, veremos alguns exemplos básicos para atualizar um documento usando o $push operador. Mais tarde, também discutiremos os vários casos de uso de $push e $addtoSet operadores.
Vamos nos aprofundar nos vários métodos para inserir documentos em um array no MongoDB.
2. Inicialização do banco de dados
Primeiro, vamos configurar um novo banco de dados baeldung e uma coleção de amostras, pedidos :
use baeldung;
db.createCollection(orders);
Vamos agora adicionar alguns documentos à coleção usando o insertMany método:
db.orders.insertMany([
{
"customerId": 1023,
"orderTimestamp": NumberLong("1646460073000"),
"shippingDestination": "336, Street No.1 Pawai Mumbai",
"purchaseOrder": 1000,
"contactNumber":"9898987676",
"items": [
{
"itemName": "BERGER",
"quantity": 1,
"price": 500
},
{
"itemName": "VEG PIZZA",
"quantity": 1,
"price": 800
}
]
},
{
"customerId": 1027,
"orderTimestamp": NumberLong("1646460087000"),
"shippingDestination": "445, Street No.2 Pawai Mumbai",
"purchaseOrder": 2000,
"contactNumber":"9898987676",
"items": [
{
"itemName": "BERGER",
"quantity": 1,
"price": 500
},
{
"itemName": "NON-VEG PIZZA",
"quantity": 1,
"price": 1200
}
]
}
]);
Em caso de inserção bem-sucedida, o comando acima imprimirá um JSON semelhante ao mostrado abaixo:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("622300cc85e943405d04b567"),
ObjectId("622300cc85e943405d04b568")
]
}
Até agora, configuramos com sucesso o banco de dados e a coleção. Usaremos este banco de dados e coleção para todos os exemplos.
3. Operação de push usando o Mongo Query
O MongoDB fornece vários tipos de operadores de array para atualizar os arrays nos documentos do MongoDB. O $push O operador no MongoDB anexa o valor no final da matriz. Dependendo do tipo de consulta, podemos usar o $push operador com métodos como updateOne , updateMany , localizarAndModificar , etc
Vamos agora examinar a consulta do shell usando o $push operador:
db.orders.updateOne(
{
"customerId": 1023
},
{
$push: {
"items":{
"itemName": "PIZZA MANIA",
"quantity": 1,
"price": 800
}
}
});
A consulta acima retornará o seguinte documento:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Agora vamos verificar o documento com customerId 1023. Aqui, podemos ver que o novo item é inserido no final da lista “itens “:
{
"customerId" : 1023,
"orderTimestamp" : NumberLong("1646460073000"),
"shippingDestination" : "336, Street No.1 Pawai Mumbai",
"purchaseOrder" : 1000,
"contactNumber" : "9898987676",
"items" : [
{
"itemName" : "BERGER",
"quantity" : 1,
"price" : 500
},
{
"itemName" : "VEG PIZZA",
"quantity" : 1,
"price" : 800
},
{
"itemName" : "PIZZA MANIA",
"quantity" : 1,
"price" : 800
}
]
}
4. Operação push usando código de driver Java
Até agora, discutimos a consulta do shell do MongoDB para enviar o documento para um array. Vamos agora implementar a consulta de atualização push usando o código Java.
Antes de realizar a operação de atualização, vamos primeiro nos conectar aos pedidos coleção no baeldung base de dados:
mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("orders");
Aqui, neste caso, estamos nos conectando ao MongoDB que está sendo executado na porta padrão 27017 no host local.
4.1. Como usar o DBObject
O driver Java do MongoDB fornece suporte para o DBObject e BSON documento. Aqui, o DBObject faz parte do driver legado do MongoDB, mas ele está obsoleto na versão mais recente do MongoDB.
Vamos agora examinar o código do driver Java para inserir novos valores no array:
DBObject listItem = new BasicDBObject("items", new BasicDBObject("itemName", "PIZZA MANIA")
.append("quantity", 1)
.append("price", 800));
BasicDBObject searchFilter = new BasicDBObject("customerId", 1023);
BasicDBObject updateQuery = new BasicDBObject();
updateQuery.append("$push", listItem);
UpdateResult updateResult = collection.updateOne(searchFilter, updateQuery);
Na consulta acima, primeiro criamos o documento do item usando o BasicDBObject . Com base em searchQuery, os documentos da coleção serão filtrados e os valores serão inseridos no array.
4.2. Como usar o BSON Documento
O BSON Document é a nova maneira de acessar o documento do MongoDB em Java que é construído com a pilha de cliente mais recente. O org.bson.Document classe é menos complicado e mais fácil de usar.
Vamos usar o org.bson.Document class para enviar valores para o array “items” :
Document item = new Document()
.append("itemName1", "PIZZA MANIA")
.append("quantity", 1).append("price", 800);
UpdateResult updateResult = collection.updateOne(Filters.eq("customerId", 1023), Updates.push("items", item));
Nesse caso, a implementação do BSON é semelhante ao código executado usando o DBObject, e a atualização também será a mesma. Aqui, usamos o updateOne método para atualizar apenas um único documento.
5. Como usar o addToSet Operador
O $addToSet O operador também pode ser usado para enviar um valor na matriz. Este operador adiciona valores somente se esse valor não existir na matriz. Caso contrário, ele simplesmente irá ignorá-lo. Enquanto o operador push enviará o valor como condição para filtrar a correspondência.
Um ponto importante a ser observado é o $addToSet operador não empurra o valor de trabalho no caso de um item duplicado. Por outro lado, o operador $push apenas empurra o valor para a matriz, independentemente de quaisquer outras condições.
5.1. Consulta do Shell usando o addToSet Operador
A consulta do shell mongo do $addToSet operador é semelhante ao $push operador, mas o $addToSet não insere o valor duplicado na matriz.
Vamos agora verificar a consulta do MongoDB para enviar os valores para um array usando o $addToset :
db.orders.updateOne(
{
"customerId": 1023
},
{
$addToSet: {
"items":{
"itemName": "PASTA",
"quantity": 1,
"price": 1000
}
}
});
Neste caso, a saída será a seguinte:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
Neste caso, usamos o $addToSet operador, e o documento será enviado para a matriz "itens" somente se for exclusivo.
5.2. Driver Java usando o addToSet Operador
O $addToSet O operador fornece um tipo diferente de operação de atualização de array em comparação com o operador push:
Document item = new Document()
.append("itemName1", "PIZZA MANIA")
.append("quantity", 1).append("price", 800);
UpdateResult updateResult = collection
.updateOne(Filters.eq("customerId", 1023), Updates.addToSet("items", item));
System.out.println("updateResult:- " + updateResult);
No código acima, primeiro, criamos o documento “item “, e com base no customerId filtro, o updateOne tentará enviar o documento “item ” na matriz “itens “.