Retorne os documentos onde o status
seja "active" e a age
seja maior que 30, ou onde o name
comece com a letra "A".
db.pessoas.find({
$and: [
{
$or: [
{ status: "active" },
{ age: { $gt: 30 } }
]
},
{ name: { $regex: /^A/ } }
]
});
Explicação:
- Usa-se
$and
para combinar duas condições. - Dentro do
$and
, um$or
verifica se ostatus
é "active" ou se aage
é maior que 30. - A segunda condição do
$and
verifica se oname
começa com "A".
Retorne os documentos onde o status
seja "active" ou o campo age
não esteja presente e onde o address
contenha "Main St" ou "Pine Ave".
db.pessoas.find({
$or: [
{ status: "active" },
{ age: { $exists: false } }
],
$and: [
{ address: { $in: ["123 Main St", "789 Pine Ave"] } }
]
});
Explicação:
- O
$or
verifica se ostatus
é "active" ou se o campoage
não existe. - O
$and
garante que oaddress
contenha "123 Main St" ou "789 Pine Ave" (trabalhando com arrays).
Retorne os documentos onde a age
não seja menor que 25 e o status
não seja "inactive", e onde o campo email
esteja ausente ou o campo name
não comece com "J".
db.pessoas.find({
$and: [
{ age: { $not: { $lt: 25 } } },
{ status: { $not: { $eq: "inactive" } } },
{
$nor: [
{ email: { $exists: true } },
{ name: { $regex: /^J/ } }
]
}
]
});
Explicação:
$not
é usado para especificar que aage
não deve ser menor que 25, e ostatus
não deve ser "inactive".$nor
retorna documentos que não atendem a nenhuma das condições dentro dele (email não existe ou o nome não começa com "J").
O operador $elemMatch
é usado para combinar múltiplas condições em um único elemento de um array. Ele garante que todas as condições dentro do $elemMatch
sejam verdadeiras para pelo menos um elemento do array.
Considere que você tem uma coleção pessoas
que agora inclui um campo adicional chamado skills
, que é um array de documentos. Cada documento dentro de skills
contém informações sobre as habilidades de uma pessoa.
{
"name": "John Doe",
"age": 34,
"status": "active",
"skills": [
{ "skill": "Python", "level": 5 },
{ "skill": "JavaScript", "level": 4 },
{ "skill": "SQL", "level": 3 }
]
}
Retorne todos os documentos em que a pessoa tenha uma habilidade de nível 4 ou maior em Python
.
db.pessoas.find({
skills: { $elemMatch: { skill: "Python", level: { $gte: 4 } } }
});
$elemMatch
verifica se existe um elemento no arrayskills
que satisfaça ambas as condições: oskill
deve ser"Python"
e olevel
deve ser maior ou igual a 4.
O operador $slice
é usado para limitar a quantidade de elementos que serão retornados de um array em uma consulta. Ele não altera os dados armazenados, mas restringe o que é exibido na consulta.
Na mesma coleção pessoas
, você quer retornar apenas os dois primeiros elementos do array skills
de cada pessoa.
Retorne os dois primeiros elementos do array skills
para todas as pessoas.
db.pessoas.find({}, { name: 1, skills: { $slice: 2 } });
- O operador
$slice: 2
limita a saída para os dois primeiros elementos do arrayskills
de cada pessoa. - O campo
name
é incluído apenas para contexto, mas você pode modificar a consulta conforme necessário.
Atenção: O $slice é usado para limitar a visualização ou projeção dos elementos de um array, enquanto o $size é usado para realizar consultas com base no tamanho do array.
Retorne apenas o último elemento do array skills
.
db.pessoas.find({}, { name: 1, skills: { $slice: -1 } });
- O operador
$slice: -1
retorna o último elemento do arrayskills
.
Aqui estão exemplos complementares com os operadores $elemMatch
e $slice
no MongoDB:
Sim! O operador $slice
permite retornar um intervalo de valores dentro de um array, semelhante a como a fatia de listas funciona em Python.
-
Retornar os primeiros N elementos:
{ $slice: N }
- retorna os primeiros
N
elementos de um array.
-
Retornar os últimos N elementos:
{ $slice: -N }
- retorna os últimos
N
elementos de um array.
-
Retornar um intervalo de elementos (composição de offset e limite):
{ $slice: [offset, limit] }
offset
indica a posição inicial elimit
indica quantos elementos serão retornados a partir desse ponto.- O
offset
pode ser negativo para contar a partir do final do array.
Imagine a coleção pessoas
com o seguinte documento:
{
"_id": 1,
"name": "John Doe",
"skills": ["Python", "JavaScript", "SQL", "C++", "Java"]
}
db.pessoas.find(
{ _id: 1 },
{ skills: { $slice: 2 } }
);
- Resultado:
["Python", "JavaScript"]
db.pessoas.find(
{ _id: 1 },
{ skills: { $slice: -2 } }
);
- Resultado:
["C++", "Java"]
db.pessoas.find(
{ _id: 1 },
{ skills: { $slice: [2, 2] } }
);
- Resultado:
["SQL", "C++"]
Você pode usar um valor negativo no offset
para começar a contagem a partir do final do array.
db.pessoas.find(
{ _id: 1 },
{ skills: { $slice: [-3, 2] } }
);
- Resultado:
["SQL", "C++"]
(Começa no terceiro elemento a partir do final e retorna 2 elementos)