Menu Docs
Página inicial do Docs
/ / /
Java síncrono
/ /

Construtores de projeções

Nesta página

  • Visão geral
  • Amostras de documentos e exemplos
  • Operações de Projeção
  • Inclusão
  • Exclusion
  • Combinando projeções
  • Exclusão de _id
  • Projetar uma correspondência de elemento da array
  • Projetar uma divisão da array
  • Projetar uma Pontuação de Texto

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ído

  • A 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.

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 }
]
}

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.

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"}

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}

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"}

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"}

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 query 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}]}

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>
]
}

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}

Voltar

Construtores de índices