类型括号是 MongoDB 应用于查询谓词的隐式过滤器:对给定 BSON 类型的比较仅匹配该类型的值。示例,{ a: { $gt: 0 } } 表示“a 是一个数字且 a 大于 0”。
哪些操作符使用类型括号
不等式运算符($gt、$gte、$lt 和 $lte)使用类型括号。
否定($ne 和 $nin)不使用类型括号。它们匹配任何类型的值。示例,{ a: { $ne: 2 } } 也会匹配 a 为 string 或对象的文档,以及比较中的数字类型。
数字比较的类型括号
BSON 包含多种数值类型:int、long、double 和 decimal。MongoDB 在进行比较时会将这些视为等效,因此与数字的比较可以匹配任何数字类型的值。
示例,{ a: { $gt: 0 } } 匹配 a 个类型为 int、long、double 或 decimal 的值。
类型括号和隐式数组遍历
当比较隐式遍历数组时,类型括号也应用。如果目标字段是数组,则比较会匹配至少有一个元素满足比较条件且与操作数类型相同的文档。
示例,{ a: { $gt: 3 } } 匹配 { a: [ 1, 2, 3, 4 ] } 和 { a: [ "red", 4, "blue" ] },但不匹配 { a: [ "red", "blue" ] }。
例子
考虑以下集合:
{ "_id": "apples", "qty": 5 } { "_id": "bananas", "qty": 7 } { "_id": "apricots", "qty": 3 } { "_id": "oranges", "qty": { "in stock": 8, "ordered": 12 } } { "_id": "avocados", "qty": "fourteen" }
以下查询使用 $gt 来返回其中的 qty 值大于 4 的文档:
db.inventory.find( { qty: { $gt: 4 } } )
[ { _id: 'apples', qty: 5 }, { _id: 'bananas', qty: 7 } ]
不返回 _id 等于 "apricots" 的文档,因为其 qty 值 3 不大于 4。
_id 等于 "avocados" 的文档不会返回,因为其 qty 值的类型为 string,而 $gt 操作数的类型为 integer。
不返回_id等于"oranges"的文档,因为其qty值的类型为object。
提示
要在集合中强制数据类型,请使用模式验证。