W MongoDB możesz użyć $type
elementowy operator zapytania do filtrowania kolekcji dokumentów na podstawie typu BSON. Zwraca tylko te dokumenty, które mają określony typ BSON w określonym polu.
Podajesz pole i typ BSON oraz $type
zwróci wszystkie pasujące dokumenty.
Przykład
Załóżmy, że wstawiamy następujące dokumenty do zbioru o nazwie 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 },
])
Każdy dokument zawiera pracownika wraz z wynagrodzeniem tego pracownika.
Jednak chociaż każdy dokument ma remuneration
widzimy, że nie ma spójności między dokumentami w odniesieniu do typu BSON używanego w tym polu.
Możemy użyć $type
operator zapytania, aby zwrócić tylko te dokumenty, dla których remuneration
pole jest określonego typu BSON.
Przykład:
db.employees.find( { remuneration: { $type: "double" } } )
Wynik:
{ "_id" : 3, "name" : "Fritz", "remuneration" : 25000 }
W tym przypadku tylko jeden dokument ma typ BSON typu double w remuneration
pole.
Zobaczmy, które z nich zawierają ciągi:
db.employees.find( { remuneration: { $type: "string" } } )
Wynik:
{ "_id" : 1, "name" : "Sandy", "remuneration" : "Too Much!!!" } { "_id" : 5, "name" : "Beck", "remuneration" : "10% commission" } { "_id" : 6, "name" : "Peter", "remuneration" : "70K" }
number
Alias
Możesz użyć number
alias jako wygodny sposób zwracania dokumentów zawierających typy liczbowe.
Alias numeru pasuje do następujących typów BSON:
double
32-bit integer
64-bit integer
decimal
Przykład:
db.employees.find( { remuneration: { $type: "number" } } )
Wynik:
{ "_id" : 2, "name" : "Sarah", "remuneration" : 128000 } { "_id" : 3, "name" : "Fritz", "remuneration" : 25000 } { "_id" : 4, "name" : "Chris", "remuneration" : NumberDecimal("45000.75") }
Sprawdź wiele typów
Możesz sprawdzić wiele typów, dostarczając tablicę typów BSON.
Przykład:
db.employees.find( {
remuneration: { $type: ["double", "int", "null"] }
} )
Wynik:
{ "_id" : 2, "name" : "Sarah", "remuneration" : 128000 } { "_id" : 3, "name" : "Fritz", "remuneration" : 25000 } { "_id" : 7, "name" : "Homer", "remuneration" : null }
Filtruj według numeru
Każdy typ BSON ma odpowiedni numer i alias (zgodnie z dokumentacją MongoDB).
W poprzednich przykładach użyto aliasu. Możesz alternatywnie użyć numeru zamiast aliasu typu BSON.
Przykład:
db.employees.find( {
remuneration: { $type: [1, 16, 10] }
} )
Wynik:
{ "_id" : 2, "name" : "Sarah", "remuneration" : 128000 } { "_id" : 3, "name" : "Fritz", "remuneration" : 25000 } { "_id" : 7, "name" : "Homer", "remuneration" : null }
W tym przypadku podałem tablicę liczb, które odpowiadają double
, int
i null
(co zwraca ten sam wynik, co w poprzednim przykładzie).
Przed MongoDB 3.2 akceptowane były tylko liczby z $type
operator zapytania. Aliasy ciągów są akceptowane dopiero od MongoDB 3.2.
Zwróć typ pola
Jest też $type
operator potoku agregacji, który pozwala uzyskać typ BSON wartości pola.