I MongoDB kan du använda $type
elementfrågeoperator för att filtrera en samling dokument baserat på BSON-typ. Den returnerar bara de dokument som har en viss BSON-typ i ett specifikt fält.
Du anger fältet och BSON-typen och $type
kommer att returnera alla dokument som matchar.
Exempel
Anta att vi infogar följande dokument i en samling som heter 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 },
])
Varje dokument innehåller en anställd tillsammans med den anställdes ersättning.
Men medan varje dokument har en remuneration
fältet, kan vi se att det inte finns någon enhetlighet i dokumenten när det gäller den BSON-typ som används i det här fältet.
Vi kan använda $type
frågeoperatör för att returnera bara de dokument för vilka remuneration
fältet är av en viss BSON-typ.
Exempel:
db.employees.find( { remuneration: { $type: "double" } } )
Resultat:
{ "_id" : 3, "name" : "Fritz", "remuneration" : 25000 }
I det här fallet har bara ett dokument en BSON-typ av dubbel i remuneration
fältet.
Låt oss se vilka som innehåller strängar:
db.employees.find( { remuneration: { $type: "string" } } )
Resultat:
{ "_id" : 1, "name" : "Sandy", "remuneration" : "Too Much!!!" } { "_id" : 5, "name" : "Beck", "remuneration" : "10% commission" } { "_id" : 6, "name" : "Peter", "remuneration" : "70K" }
number
Alias
Du kan använda number
alias som ett bekvämt sätt att returnera dokument som innehåller numeriska typer.
Nummeraliaset matchar följande BSON-typer:
double
32-bit integer
64-bit integer
decimal
Exempel:
db.employees.find( { remuneration: { $type: "number" } } )
Resultat:
{ "_id" : 2, "name" : "Sarah", "remuneration" : 128000 } { "_id" : 3, "name" : "Fritz", "remuneration" : 25000 } { "_id" : 4, "name" : "Chris", "remuneration" : NumberDecimal("45000.75") }
Sök efter flera typer
Du kan söka efter flera typer genom att tillhandahålla en rad BSON-typer.
Exempel:
db.employees.find( {
remuneration: { $type: ["double", "int", "null"] }
} )
Resultat:
{ "_id" : 2, "name" : "Sarah", "remuneration" : 128000 } { "_id" : 3, "name" : "Fritz", "remuneration" : 25000 } { "_id" : 7, "name" : "Homer", "remuneration" : null }
Filtrera efter nummer
Varje BSON-typ har ett motsvarande nummer och alias (som beskrivs i MongoDB-dokumentationen).
De tidigare exemplen använder aliaset. Du kan alternativt använda numret istället för aliaset av BSON-typ.
Exempel:
db.employees.find( {
remuneration: { $type: [1, 16, 10] }
} )
Resultat:
{ "_id" : 2, "name" : "Sarah", "remuneration" : 128000 } { "_id" : 3, "name" : "Fritz", "remuneration" : 25000 } { "_id" : 7, "name" : "Homer", "remuneration" : null }
I det här fallet tillhandahöll jag en uppsättning siffror som motsvarar double
, int
och null
(vilket ger samma resultat som föregående exempel).
Före MongoDB 3.2 accepterades endast nummer med $type
frågeoperatör. Strängalias har bara accepterats sedan MongoDB 3.2.
Returnera ett fälts typ
Det finns också en $type
aggregeringspipeline-operatör som låter dig få BSON-typen för ett fälts värde.