《MongoDB入门教程》第08篇 比较运算符

Posted 不剪发的Tony老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《MongoDB入门教程》第08篇 比较运算符相关的知识,希望对你有一定的参考价值。

本文将会介绍 MongoDB 中查找文档时常用的一些比较运算符,包括 $eq、$gt、$gte、$lt、$lte、$ne、$in 以及 $nin。

$eq 运算符

$eq 运算符用于匹配字段等于(=)指定值的文档。$eq 运算符的语法如下:

 <field>:  $eq: <value>  

以上语法等价于下面的写法:

<field>: <value>

我们创建一个集合 products 作为下文中的演示:

db.products.insertMany([
     "_id" : 1, "name" : "xPhone", "price" : 799, "releaseDate": ISODate("2011-05-14"), "spec" :  "ram" : 4, "screen" : 6.5, "cpu" : 2.66 ,"color":["white","black"],"storage":[64,128,256],
     "_id" : 2, "name" : "xTablet", "price" : 899, "releaseDate": ISODate("2011-09-01") , "spec" :  "ram" : 16, "screen" : 9.5, "cpu" : 3.66 ,"color":["white","black","purple"],"storage":[128,256,512],
     "_id" : 3, "name" : "SmartTablet", "price" : 899, "releaseDate": ISODate("2015-01-14"), "spec" :  "ram" : 12, "screen" : 9.7, "cpu" : 3.66 ,"color":["blue"],"storage":[16,64,128],
     "_id" : 4, "name" : "SmartPad", "price" : 699, "releaseDate": ISODate("2020-05-14"),"spec" :  "ram" : 8, "screen" : 9.7, "cpu" : 1.66 ,"color":["white","orange","gold","gray"],"storage":[128,256,1024],
     "_id" : 5, "name" : "SmartPhone", "price" : 599,"releaseDate": ISODate("2022-09-14"), "spec" :  "ram" : 4, "screen" : 9.7, "cpu" : 1.66 ,"color":["white","orange","gold","gray"],"storage":[128,256]
 ])

以下示例使用 $eq 运算符查找 products 集合中 price 字段等于 899 的所有文档:

db.products.find(
    price: 
        $eq: 899
    
, 
    name: 1,
    price: 1
)

我们也可以使用以下等价写法:

db.products.find(
    price: 899
, 
    name: 1,
    price: 1
)

以上两个示例的返回结果相同:

[
   _id: 2, name: 'xTablet', price: 899 ,
   _id: 3, name: 'SmartTablet', price: 899 
]

下面的示例使用 $eq 运算符查找嵌套文档 spec 中字段 ram 的值等于 4 的文档:

db.products.find(
    "spec.ram": 
        $eq: 4
    
, 
    name: 1,
    "spec.ram": 1
)

查询返回的文档如下:

[
   _id: 1, name: 'xPhone', spec:  ram: 4  ,
   _id: 5, name: 'SmartPhone', spec:  ram: 4  
]

接下来的示例使用 $eq 运算符查找 products 集合中数组 color 包含“black”元素的文档:

db.products.find(
    color: 
        $eq: "black"
    
, 
    name: 1,
    color: 1
)

查询返回的文档如下:

[
   _id: 1, name: 'xPhone', color: [ 'white', 'black' ] ,
   _id: 2, name: 'xTablet', color: [ 'white', 'black', 'purple' ] 
]

$gt 运算符

$gt 运算符用于匹配字段大于(>)指定值的文档。$gt 运算符的语法如下:

 field:  $gt: value

以下示例使用 $gt 运算符查找集合 products 中 price 大于 699 的文档:

db.products.find(
    price: 
        $gt: 699
    
, 
    name: 1,
    price: 1
)

查询返回的结果如下:

[
   _id: 1, name: 'xPhone', price: 799 ,
   _id: 2, name: 'xTablet', price: 899 ,
   _id: 3, name: 'SmartTablet', price: 899 
]

$gte 运算符

$gte 运算符用于匹配字段大于等于(>=)指定值的文档。$gte 运算符的语法如下:

field: $gte: value 

以下示例使用 $gte 运算符查找集合 products 中嵌入文档 spec 的字段 screen 大于或者等于 9.5 的文档:

db.products.find(
    "spec.screen": 
        $gte: 9.5
    
, 
    name: 1,
    "spec.screen": 1
)

返回结果如下:

[
   _id: 2, name: 'xTablet', spec:  screen: 9.5  ,
   _id: 3, name: 'SmartTablet', spec:  screen: 9.7  ,
   _id: 4, name: 'SmartPad', spec:  screen: 9.7  ,
   _id: 5, name: 'SmartPhone', spec:  screen: 9.7  
]

$lt 运算符

$lt 运算符用于匹配字段小于(<)指定值的文档。$lt 运算符的语法如下:

field: $lt: value 

以下示例使用 $lt 运算符查找集合 products 中数组字段 storage 至少包含一个小于 128 的元素的文档:

db.products.find(
    storage: 
        $lt: 128
    
, 
    name: 1,
    storage: 1
)

查询返回的文档如下:

[
   _id: 1, name: 'xPhone', storage: [ 64, 128, 256 ] ,
   _id: 3, name: 'SmartTablet', storage: [ 16, 64, 128 ] 
]

$lte 运算符

$lte 运算符用于匹配字段小于等于(<=)指定值的文档。$lte 运算符的语法如下:

field: $lte: value 

以下示例使用 $lte 运算符查找集合 products 中发布日期早于或者等于 2015-01-11 的所有文档:

db.products.find(
    "releaseDate": 
        $lte: new ISODate('2015-01-01')
    
, 
    name: 1,
    releaseDate: 1
);

查询返回的文档如下:

[
  
    _id: 1,
    name: 'xPhone',
    releaseDate: ISODate("2011-05-14T00:00:00.000Z")
  ,
  
    _id: 2,
    name: 'xTablet',
    releaseDate: ISODate("2011-09-01T00:00:00.000Z")
  
]

$ne 运算符

$ne 运算符匹配字段不等于(<>)指定值的文档。$ne 运算符的语法如下:

 field: $ne: value

以下示例使用 $ne 运算符查找集合 products 中 price 不等于 899 的文档:

db.products.find(
    price: 
        $ne: 899
    
, 
    name: 1,
    price: 1
)

查询返回的文档如下:

[
   _id: 1, name: 'xPhone', price: 799 ,
   _id: 4, name: 'SmartPad', price: 699 ,
   _id: 5, name: 'SmartPhone', price: 599 ,
   _id: 6, name: 'xWidget' 
]

$in 运算符

$in 运算符匹配字段等于(=)数组中任意值的文档。$in 运算符的语法如下:

 field:  $in: [<value1>, <value2>,...] 

如果 field 只有一个值,$in 运算符匹配该字段等于数组中任意值的文档。如果 field 也是一个数组,$in 运算符匹配该数组包含数组 [value1, value2,…] 中任意值的文档。

数组列表 value1, value2, … 可以是一个常量列表或者正则表达式列表。

正则表达式是一组定义搜索模式的字符,例如正则表达式 /\\d+/ 匹配任何数组,包括1,123,1234 等。

以下示例使用 $in 运算符查找 products 集合中 price 字段等于 599 或者 799 的文档:

db.products.find(
    price: 
        $in: [699, 799]
    
, 
    name: 1,
    price: 1
)

查询返回的文档如下:

[
   _id: 1, name: 'xPhone', price: 799 ,
   _id: 4, name: 'SmartPad', price: 699 
]

$nin 运算符

$nin 运算符匹配字段不等于(!=)数组中任意值的文档,或者指定字段不存在的文档。$nin 运算符的语法如下:

 field:  $nin: [ <value1>, <value2> ...] 

以下示例使用 $nin 运算符查找 products 集合中 price 字段既不等于 599 也不等于 799 的文档:

db.products.find(
    price: 
        $nin: [699, 799]
    
, 
    name: 1,
    price: 1
)

查询返回的文档如下:

[
   _id: 2, name: 'xTablet', price: 899 ,
   _id: 3, name: 'SmartTablet', price: 899 ,
   _id: 5, name: 'SmartPhone', price: 599 
]

以下示例使用 $nin 运算符查找 color 数组字段中不包含任何匹配正则表达式 /^g+/ 或者 /^w+/ 的元素的文档:

db.products.find(
    color: 
        $nin: [/^g+/, /^w+/]
    
, 
    name: 1,
    color: 1
)

查询返回的文档如下:

[  _id: 3, name: 'SmartTablet', color: [ 'blue' ]  ]

以上是关于《MongoDB入门教程》第08篇 比较运算符的主要内容,如果未能解决你的问题,请参考以下文章

《MongoDB入门教程》第08篇 比较运算符

Python入门教程第13篇 比较运算符

《MongoDB入门教程》第09篇 逻辑运算符

《MongoDB入门教程》第09篇 逻辑运算符

《MongoDB入门教程》第09篇 逻辑运算符

《MongoDB入门教程》第10篇 元素运算符