Definição
$type$typeseleciona documentos onde o valor dofieldé uma instância do(s) tipo(s)de BSON especificado(s). A query por tipo de dados é útil para dados não estruturados em que os tipos de dados não são previsíveis.
Compatibilidade
Você pode utilizar o $type para implantações hospedadas nos seguintes ambientes:
MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem
MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB
MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB
Sintaxe
Uma expressão $type para um único tipo de BSON tem a seguinte sintaxe:
{ field: { $type: <BSON type> } }
Você pode especificar o número ou o apelido do tipo BSON.
A expressão $type também pode aceitar um array de tipos de BSON e tem a seguinte sintaxe:
{ field: { $type: [ <BSON type1> , <BSON type2>, ... ] } }
A query acima corresponde a documentos em que o valor field é qualquer um dos tipos listados. Os tipos especificados no array podem ser apelidos numéricos ou de string.
Para ver um exemplo, consulte Query por vários tipos de dados.
Tipos disponíveis descreve os tipos de BSON e seus apelidos numéricos e de string correspondentes.
Dica
$isNumber- verifica se o argumento é um número.$type (Aggregation)- retorna o tipo de BSON do argumento.
Comportamento
$type retorna documentos em que o tipo de BSON do field corresponde ao tipo de BSON passado para $type.
arrays
Para documentos em que field é uma array, $type retorna documentos nos quais pelo menos um elemento de array corresponde a um tipo passado para $type.
Queries de $type: "array" retornam documentos onde o próprio campo é uma array.
Tipos disponíveis
O operador $type aceita apelidos de string para os tipos de BSON, além dos números correspondentes aos tipos de BSON.
$type suporta o alias number, que corresponde aos seguintes tipos de BSON:
Por exemplo, consulte Exemplos.
Dica
MinKey e MaxKey
MinKey e MaxKey são usados em operações de comparação e existem principalmente para uso interno. Para todos os valores de elemento BSON possíveis, MinKey é sempre o menor valor e MaxKey é sempre o maior valor.
Consultar minKey ou maxKey com $type retorna apenas campos que correspondem aos valores especiais MinKey ou MaxKey.
Por exemplo, a seguinte coleção data tem estes documentos com MinKey e MaxKey:
db.data.insertMany( [ { _id: 1, x: MinKey() }, { _id: 2, y: MaxKey() } ] )
A query abaixo retorna o documento com _id: 1:
db.data.find( { x: { $type: "minKey" } } )
[ { _id: 1, x: MinKey() } ]
A query abaixo retorna o documento com _id: 2:
db.data.find( { y: { $type: "maxKey" } } )
[ { _id: 2, y: MaxKey() } ]
Exemplos
Query por tipo de dados
Os exemplos nesta página usam dados do conjunto de dados de amostra sample_mflix. Para obter detalhes sobre como carregar esse conjunto de dados em sua implantação autogerenciada do MongoDB , consulte Carregar o conjunto de dados de amostra. Se você fez modificações nos bancos de dados de amostra, talvez seja necessário descartar e recriar os bancos de dados para executar os exemplos nesta página.
A coleção movies armazena classificações IMDb no campo imdb.rating. A maioria dos documentos armazena imdb.rating como um double, mas alguns documentos o armazenam como um string vazio ("").
As queries a seguir retornam documentos de 2013 onde imdb.rating é o tipo BSON string.
Esta query especifica o tipo com o número do tipo BSON.
db.movies.find( { "imdb.rating": { $type: 2 }, year: 2013 }, { _id: 0, title: 1, year: 1, "imdb.rating": 1 } )
[ { title: 'Coming to Terms', year: 2013, imdb: { rating: '' } }, { title: 'Absent Minded', year: 2013, imdb: { rating: '' } } ]
Esta query especifica o tipo com o alias do tipo BSON:
db.movies.find( { "imdb.rating": { $type: "string" }, year: 2013 }, { _id: 0, title: 1, year: 1, "imdb.rating": 1 } )
[ { title: 'Coming to Terms', year: 2013, imdb: { rating: '' } }, { title: 'Absent Minded', year: 2013, imdb: { rating: '' } } ]
A query a seguir usa o apelido number para retornar documentos em que imdb.rating é o tipo de BSON double, int ou long:
db.movies.find( { "imdb.rating": { $type: "number" }, runtime: { $gt: 1000 } }, { _id: 0, title: 1, runtime: 1, "imdb.rating": 1 } )
[ { runtime: 1256, title: 'Centennial', imdb: { rating: 8.5 } }, { runtime: 1140, title: 'Baseball', imdb: { rating: 9.1 } } ]
Query por vários tipos de dados
As queries a seguir retornam documentos em que imdb.rating é o tipo de BSON string ou double. A primeira query utiliza apelidos numéricos e a segunda query utiliza apelidos de string.
db.movies.find( { "imdb.rating": { $type: [ 2, 1 ] }, runtime: { $gt: 1000 } }, { _id: 0, title: 1, runtime: 1, "imdb.rating": 1 } )
[ { runtime: 1256, title: 'Centennial', imdb: { rating: 8.5 } }, { runtime: 1140, title: 'Baseball', imdb: { rating: 9.1 } } ]
db.movies.find( { "imdb.rating": { $type: [ "string", "double" ] }, runtime: { $gt: 1000 } }, { _id: 0, title: 1, runtime: 1, "imdb.rating": 1 } )
[ { runtime: 1256, title: 'Centennial', imdb: { rating: 8.5 } }, { runtime: 1140, title: 'Baseball', imdb: { rating: 9.1 } } ]
Query por tipo de array
A coleção movies armazena gêneros de filmes no campo genres como uma array. A seguinte query retorna documentos onde o campo genres é uma array:
db.movies.find( { genres: { $type: "array" }, runtime: { $gt: 1000 } }, { _id: 0, title: 1, genres: 1 } )
[ { title: 'Centennial', genres: [ 'Action', 'Adventure', 'Drama' ] }, { title: 'Baseball', genres: [ 'Documentary', 'History', 'Sport' ] } ]
Query por MinKey e MaxKey
Os exemplos a seguir usam a coleção restaurants que usa minKey para qualquer nota que seja reprovada:
db.restaurants.insertOne( { _id: 1, address: { building: "230", coord: [ -73.996089, 40.675018 ], street: "Huntington St", zipcode: "11231" }, borough: "Brooklyn", cuisine: "Bakery", grades: [ { date : new Date(1393804800000), grade : "C", score : 15 }, { date : new Date(1378857600000), grade : "C", score : 16 }, { date : new Date(1358985600000), grade : MinKey(), score : 30 }, { date : new Date(1322006400000), grade : "C", score : 15 } ], name : "Dan's Donuts", restaurant_id : "30075445" } )
E maxKey para qualquer nota que seja a nota mais alta para passar:
db.restaurants.insertOne( { _id : 2, address : { building : "1166", coord : [ -73.955184, 40.738589 ], street : "Manhattan Ave", zipcode : "11222" }, borough: "Brooklyn", cuisine: "Bakery", grades: [ { date : new Date(1393804800000), grade : MaxKey(), score : 2 }, { date : new Date(1378857600000), grade : "B", score : 6 }, { date : new Date(1358985600000), grade : MaxKey(), score : 3 }, { date : new Date(1322006400000), grade : "B", score : 5 } ], name : "Dainty Daisey's Donuts", restaurant_id : "30075449" } )
A seguinte query retorna qualquer restaurante cujo campo grades.grade contém minKey ou é uma array contendo um elemento do tipo especificado:
db.restaurants.find( { "grades.grade" : { $type : "minKey" } } )
[ { _id: 1, address: { building: '230', coord: [ -73.996089, 40.675018 ], street: 'Huntington St', zipcode: '11231' }, borough: 'Brooklyn', cuisine: 'Bakery', grades: [ { date: ISODate('2014-03-03T00:00:00.000Z'), grade: 'C', score: 15 }, { date: ISODate('2013-09-11T00:00:00.000Z'), grade: 'C', score: 16 }, { date: ISODate('2013-01-24T00:00:00.000Z'), grade: MinKey(), score: 30 }, { date: ISODate('2011-11-23T00:00:00.000Z'), grade: 'C', score: 15 } ], name: ..., restaurant_id: '30075445' } ]
A seguinte query retorna qualquer restaurante cujo campo grades.grade contém maxKey ou é uma array contendo um elemento do tipo especificado:
db.restaurants.find( { "grades.grade" : { $type : "maxKey" } } )
[ { _id: 2, address: { building: '1166', coord: [ -73.955184, 40.738589 ], street: 'Manhattan Ave', zipcode: '11222' }, borough: 'Brooklyn', cuisine: 'Bakery', grades: [ { date: ISODate('2014-03-03T00:00:00.000Z'), grade: MaxKey(), score: 2 }, { date: ISODate('2013-09-11T00:00:00.000Z'), grade: 'B', score: 6 }, { date: ISODate('2013-01-24T00:00:00.000Z'), grade: MaxKey(), score: 3 }, { date: ISODate('2011-11-23T00:00:00.000Z'), grade: 'B', score: 5 } ], name: ..., restaurant_id: '30075449' } ]