Construtores de projeções
Nesta página
Visão geral
Neste guia, você pode aprender como especificar projeções utilizandoconstrutores do no driver Java MongoDB .
O MongoDB oferece projeção de campo, especificando quais campos incluir e excluir ao gerar resultados de uma query. A projeção no MongoDB segue algumas regras básicas:
O campo
_id
está sempre incluído, a menos que esteja explicitamente excluídoA especificação de um campo para inclusão exclui implicitamente todos os outros campos exceto o campo
_id
Especificar um campo para exclusão remove apenas esse campo em um resultado de consulta
Encontre mais informações sobre mecânicos de projeção aqui.
A classe Projections
fornece métodos de fábrica estáticos para todos os operadores de projeção do MongoDB. Cada método retorna uma instância do tipo BSON que você pode passar para qualquer método que espera uma projeção.
Dica
Por questões de brevidade, você pode optar por importar os métodos da classe Projeções estaticamente:
import static com.mongodb.client.model.Projections.*;
Os exemplos a seguir pressupõem essa importação estática.
Amostras de documentos e exemplos
As seguintes seções apresentam exemplos que executam operações de query e projeção em uma collection de amostra denominada projection_builders
. Cada seção usa uma variável chamada collection
para fazer referência à instância MongoCollection
da coleção projection_builders
.
O acervo contém os seguintes documentos, representando as temperaturas médias mensais em Celsius para os anos de 2018 e 2019:
{ "year" : 2018, "type" : "even number but not a leap year", "temperatures" : [ { "month" : "January", "avg" : 9.765 }, { "month" : "February", "avg" : 9.675 }, { "month" : "March", "avg" : 10.004 }, { "month" : "April", "avg" : 9.983 }, { "month" : "May", "avg" : 9.747 }, { "month" : "June", "avg" : 9.65 }, { "month" : "July", "avg" : 9.786 }, { "month" : "August", "avg" : 9.617 }, { "month" : "September", "avg" : 9.51 }, { "month" : "October", "avg" : 10.042 }, { "month" : "November", "avg" : 9.452 }, { "month" : "December", "avg" : 9.86 } ] }, { "year" : 2019, "type" : "odd number, can't be a leap year", "temperatures" : [ { "month" : "January", "avg" : 10.023 }, { "month" : "February", "avg" : 9.808 }, { "month" : "March", "avg" : 10.43 }, { "month" : "April", "avg" : 10.175 }, { "month" : "May", "avg" : 9.648 }, { "month" : "June", "avg" : 9.686 }, { "month" : "July", "avg" : 9.794 }, { "month" : "August", "avg" : 9.741 }, { "month" : "September", "avg" : 9.84 }, { "month" : "October", "avg" : 10.15 }, { "month" : "November", "avg" : 9.84 }, { "month" : "December", "avg" : 10.366 } ] }
Operações de Projeção
As seções seguintes contêm informações sobre as operações de projeção disponíveis e como construí-las utilizando a classe Projections
.
Inclusão
Utilize o método include()
para especificar a inclusão de um ou mais campos.
O exemplo seguinte inclui o campo year
e (implicitamente) o campo _id
:
Bson filter = Filters.empty(); Bson projection = include("year"); collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));
O seguinte código mostra a saída desta projeção:
{"_id": {"$oid": "6042edc9f2b56342164e0790"}, "year": 2018} {"_id": {"$oid": "6042edc9f2b56342164e0791"}, "year": 2019}
O exemplo seguinte inclui os campos year
e type
e (implicitamente) o campo _id
:
Bson filter = Filters.empty(); Bson projection = include("year", "type"); collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));
O seguinte código mostra a saída desta projeção:
{"_id": {"$oid": "6042edc9f2b56342164e0790"}, "year": 2018, "type": "even number but not a leap year"} {"_id": {"$oid": "6042edc9f2b56342164e0791"}, "year": 2019, "type": "odd number, can't be a leap year"}
Exclusion
Utilize o método exclude()
para especificar a exclusão de um ou mais campos.
O exemplo seguinte exclui o campo temperatures
:
Bson filter = Filters.empty(); Bson projection = exclude("temperatures"); collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));
O seguinte código mostra a saída desta projeção:
{"_id": {"$oid": "6042edc9f2b56342164e0790"}, "year": 2018, "type": "even number but not a leap year"} {"_id": {"$oid": "6042edc9f2b56342164e0791"}, "year": 2019, "type": "odd number, can't be a leap year"}
O exemplo seguinte exclui os campos type
e temperatures
:
Bson filter = Filters.empty(); Bson projection = exclude("temperatures", "type"); collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));
O seguinte código mostra a saída desta projeção:
{"_id": {"$oid": "6042edc9f2b56342164e0790"}, "year": 2018} {"_id": {"$oid": "6042edc9f2b56342164e0791"}, "year": 2019}
Combinando projeções
Utilize o método fields()
para combinar múltiplas projeções.
O exemplo seguinte inclui os campos year
e type
e exclui o campo _id
:
Bson filter = Filters.empty(); Bson projection = fields(include("year", "type"), exclude("_id")); collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));
O seguinte código mostra a saída desta projeção:
{"year": 2018, "type": "even number but not a leap year"} {"year": 2019, "type": "odd number, can't be a leap year"}
Exclusão de _id
Utilize o método de conveniência excludeId()
para especificar a exclusão do campo _id
:
Bson filter = Filters.empty(); Bson projection = fields(include("year", "type"), excludeId()); collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));
O seguinte código mostra a saída desta projeção:
{"year": 2018, "type": "even number but not a leap year"} {"year": 2019, "type": "odd number, can't be a leap year"}
Projetar uma correspondência de elemento da array
Use a variante do método elemMatch(String, Bson)
para especificar uma projeção de array que incluirá o primeiro elemento de uma array que corresponda a um filtro de query fornecido. Essa filtragem ocorre depois que todos os documentos correspondentes ao filtro de query (se fornecidos) são recuperados.
Observação
Somente o primeiro elemento que corresponde ao filtro de consulta especificado será incluído, independentemente de quantas correspondências possam haver.
O exemplo seguinte projeta o primeiro elemento da array temperatures
onde o campo avg
é maior que 10.1
:
Bson filter = Filters.empty(); Bson projection = fields(include("year"), elemMatch("temperatures", Filters.gt("avg", 10.1))); collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));
O seguinte código mostra a saída desta projeção:
{"_id": {"$oid": "6042edc9f2b56342164e0790"}, "year": 2018} {"_id": {"$oid": "6042edc9f2b56342164e0791"}, "year": 2019, "temperatures": [{"month": "March", "avg": 10.43}]}
Depois de especificar critérios de correspondência na parte de query da sua operação, use a variante do método elemMatch(String)
para especificar uma projeção posicional para incluir o primeiro elemento de uma array. Somente documentos que correspondam ao filtro de queries serão recuperados.
Importante
Nas versões MongoDB < 4.4, o campo de array especificado deve aparecer no filtro de query. Iniciando no MongoDB 4.4, você pode usar um projeto posicional em um campo de array que não aparece no filtro de query.
O exemplo abaixo projeta o primeiro elemento da array temperatures
:
Bson filter = Filters.gt("temperatures.avg", 10.1); Bson projection = fields(include("year"), elemMatch("temperatures")); collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));
O seguinte código mostra a saída desta projeção:
{"_id": {"$oid": "6042edc9f2b56342164e0791"}, "year": 2019, "temperatures": [{"month": "March", "avg": 10.43}]}
Projetar uma divisão da array
Use o método slice()
para projetar uma fatia de uma matriz.
O exemplo seguinte projeta os primeiros elementos 6 da array temperatures
:
Bson filter = Filters.empty(); // first half of the year Bson projection = slice("temperatures", 6); collection.find(filter).projection(projection) .forEach(doc -> System.out.println(doc.toJson(JsonWriterSettings.builder().indent(true).build())));
O seguinte código mostra a saída desta projeção:
{ "_id": { "$oid": "6042f1bc8ee6fa2a84d2be69" }, "year": 2018, "type": "even number but not a leap year", "temperatures": [ ... <January-June temperature nested documents> ] } { "_id": { "$oid": "6042f1bc8ee6fa2a84d2be6a" }, "year": 2019, "type": "odd number, can't be a leap year", "temperatures": [ ... <January-June temperature nested documents> ] }
O exemplo seguinte pula os primeiros 6 elementos da matriz temperatures
e projeta os próximos 6:
Bson filter = Filters.empty(); // second half of the year Bson projection = slice("temperatures", 6, 6); collection.find(filter).projection(projection) .forEach(doc -> System.out.println(doc.toJson(JsonWriterSettings.builder().indent(true).build())));
O seguinte código mostra a saída desta projeção:
{ "_id": { "$oid": "6042f1bc8ee6fa2a84d2be69" }, "year": 2018, "type": "even number but not a leap year", "temperatures": [ ... <July-December temperature nested documents> ] } { "_id": { "$oid": "6042f1bc8ee6fa2a84d2be6a" }, "year": 2019, "type": "odd number, can't be a leap year", "temperatures": [ ... <July-December temperature nested documents> ] }
Projetar uma Pontuação de Texto
Utilize o método metaTextScore()
para especificar uma projeção da pontuação de uma consulta de texto
O exemplo seguinte projeta a pontuação de texto como o valor do campo score
:
Bson filter = Filters.text("even number"); Bson projection = fields(include("year"), metaTextScore("score")); collection.find(filter).projection(projection).forEach(doc -> System.out.println(doc.toJson()));
O seguinte código mostra a saída desta projeção:
{"_id": {"$oid": "6042f1bc8ee6fa2a84d2be69"}, "year": 2018, "score": 1.25} {"_id": {"$oid": "6042f1bc8ee6fa2a84d2be6a"}, "year": 2019, "score": 0.625}