In MongoDB, puoi usare il $type
operatore di query dell'elemento per filtrare una raccolta di documenti in base al tipo BSON. Restituisce solo quei documenti che hanno un particolare tipo BSON in un campo specifico.
Fornisci il campo e il tipo BSON e $type
restituirà tutti i documenti corrispondenti.
Esempio
Supponiamo di inserire i seguenti documenti in una raccolta denominata employees
:
db.employees.insertMany([
{ _id: 1, name: "Sandy", remuneration: "Too Much!!!" },
{ _id: 2, name: "Sarah", remuneration: NumberInt(128000) },
{ _id: 3, name: "Fritz", remuneration: 25000 },
{ _id: 4, name: "Chris", remuneration: NumberDecimal("45000.75") },
{ _id: 5, name: "Beck", remuneration: "10% commission" },
{ _id: 6, name: "Peter", remuneration: "70K" },
{ _id: 7, name: "Homer", remuneration: null },
])
Ogni documento contiene un dipendente insieme alla sua retribuzione.
Tuttavia, mentre ogni documento ha una remuneration
campo, possiamo vedere che non c'è coerenza tra i documenti per quanto riguarda il tipo BSON utilizzato in questo campo.
Possiamo usare il $type
operatore di query per restituire solo quei documenti per i quali la remuneration
il campo è di un certo tipo BSON.
Esempio:
db.employees.find( { remuneration: { $type: "double" } } )
Risultato:
{ "_id" : 3, "name" : "Fritz", "remuneration" : 25000 }
In questo caso, solo un documento ha un tipo BSON di double nella remuneration
campo.
Vediamo quali contengono stringhe:
db.employees.find( { remuneration: { $type: "string" } } )
Risultato:
{ "_id" : 1, "name" : "Sandy", "remuneration" : "Too Much!!!" } { "_id" : 5, "name" : "Beck", "remuneration" : "10% commission" } { "_id" : 6, "name" : "Peter", "remuneration" : "70K" }
Il number
alias
Puoi usare il number
alias come un modo conveniente per restituire documenti che contengono tipi numerici.
L'alias del numero corrisponde ai seguenti tipi BSON:
double
32-bit integer
64-bit integer
decimal
Esempio:
db.employees.find( { remuneration: { $type: "number" } } )
Risultato:
{ "_id" : 2, "name" : "Sarah", "remuneration" : 128000 } { "_id" : 3, "name" : "Fritz", "remuneration" : 25000 } { "_id" : 4, "name" : "Chris", "remuneration" : NumberDecimal("45000.75") }
Controlla più tipi
Puoi verificare la presenza di più tipi fornendo una matrice di tipi BSON.
Esempio:
db.employees.find( {
remuneration: { $type: ["double", "int", "null"] }
} )
Risultato:
{ "_id" : 2, "name" : "Sarah", "remuneration" : 128000 } { "_id" : 3, "name" : "Fritz", "remuneration" : 25000 } { "_id" : 7, "name" : "Homer", "remuneration" : null }
Filtra per numero
Ogni tipo BSON ha un numero e un alias corrispondenti (come descritto nella documentazione di MongoDB).
Gli esempi precedenti usano l'alias. In alternativa puoi utilizzare il numero invece dell'alias di tipo BSON.
Esempio:
db.employees.find( {
remuneration: { $type: [1, 16, 10] }
} )
Risultato:
{ "_id" : 2, "name" : "Sarah", "remuneration" : 128000 } { "_id" : 3, "name" : "Fritz", "remuneration" : 25000 } { "_id" : 7, "name" : "Homer", "remuneration" : null }
In questo caso, ho fornito una matrice di numeri che corrispondono a double
, int
e null
(che restituisce lo stesso risultato dell'esempio precedente).
Prima di MongoDB 3.2, solo i numeri erano accettati con il $type
operatore di interrogazione. Gli alias di stringa sono stati accettati solo da MongoDB 3.2.
Restituisci il tipo di campo
C'è anche un $type
operatore della pipeline di aggregazione che consente di ottenere il tipo BSON del valore di un campo.