В MongoDB можете да използвате $type
оператор за заявка на елемент за филтриране на колекция от документи въз основа на тип BSON. Връща само онези документи, които имат определен тип BSON в определено поле.
Вие предоставяте полето и типа BSON и $type
ще върне всички документи, които съвпадат.
Пример
Да предположим, че вмъкваме следните документи в колекция, наречена 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 },
])
Всеки документ съдържа служител заедно с възнаграждението на този служител.
Въпреки това, докато всеки документ има remuneration
поле, можем да видим, че няма последователност в документите по отношение на типа BSON, използван в това поле.
Можем да използваме $type
оператор на заявка, за да върне само онези документи, за които е указано remuneration
полето е от определен тип BSON.
Пример:
db.employees.find( { remuneration: { $type: "double" } } )
Резултат:
{ "_id" :3, "name" :"Fritz", "remuneration" :25000 }
В този случай само един документ има тип BSON двоен в remuneration
поле.
Нека видим кои съдържат низове:
db.employees.find( { remuneration: { $type: "string" } } )
Резултат:
{ "_id" :1, "name" :"Sandy", "remuneration" :"Твърде много!!!" }{ "_id" :5, "name" :"Beck", "remuneration" :"10% комисионна" }{ "_id" :6, "name" :"Peter", "remuneration" :"70K" }предварително>
number
ПсевдонимМожете да използвате
number
псевдоним като удобен начин за връщане на документи, които съдържат числови типове.Псевдонимът на номера съвпада със следните типове BSON:
double
32-bit integer
64-bit integer
decimal
Пример:
db.employees.find( { remuneration: { $type: "number" } } )
Резултат:
{ "_id" :2, "name" :"Сара", "възнаграждение" :128000 }{ "_id" :3, "name" :"Fritz", "remuneration" :25000 }{ "_id" :4, "name" :"Chris", "remuneration" :NumberDecimal("45000.75") }
Проверете за няколко типа
Можете да проверите за множество типове, като предоставите масив от типове BSON.
Пример:
db.employees.find( {
remuneration: { $type: ["double", "int", "null"] }
} )
Резултат:
{ "_id" :2, "name" :"Сара", "възнаграждение" :128000 }{ "_id" :3, "name" :"Fritz", "remuneration" :25000 }{ "_id" :7, "name" :"Homer", "remuneration" :null }
Филтриране по номер
Всеки тип BSON има съответен номер и псевдоним (както е посочено в документацията на MongoDB).
Предишните примери използват псевдонима. Като алтернатива можете да използвате номера вместо псевдонима на типа BSON.
Пример:
db.employees.find( {
remuneration: { $type: [1, 16, 10] }
} )
Резултат:
{ "_id" :2, "name" :"Сара", "възнаграждение" :128000 }{ "_id" :3, "name" :"Fritz", "remuneration" :25000 }{ "_id" :7, "name" :"Homer", "remuneration" :null }
В този случай предоставих масив от числа, които отговарят на double
, int
и null
(който връща същия резултат като предишния пример).
Преди MongoDB 3.2 се приемаха само числа с $type
оператор на заявка. Псевдонимите на низове се приемат само след MongoDB 3.2.
Върнете типа на поле
Има и $type
оператор на конвейер за агрегиране, който ви позволява да получите BSON типа на стойността на полето.