前言
本章节对应的是官网【Comparison Query Operators — MongoDB Manual】
正文
比较运算符有以下几个:
● $eq
$eq用来查找出字段的值等于指定值的记录。
用法:
{ : { $eq: } }
例子:查找出qty字段的值等于20的记录,对应官网【Match a Document Value】
数据源:
- { _id: 1, item: { name: "ab", code: "123" }, qty: 15, tags: [ "A", "B", "C" ] }
- { _id: 2, item: { name: "cd", code: "123" }, qty: 20, tags: [ "B" ] }
- { _id: 3, item: { name: "ij", code: "456" }, qty: 25, tags: [ "A", "B" ] }
- { _id: 4, item: { name: "xy", code: "456" }, qty: 30, tags: [ "B", "A" ] }
- { _id: 5, item: { name: "mn", code: "000" }, qty: 20, tags: [ [ "A", "B" ], "C" ] }
查询语句:
db.inventory.find( { qty: { $eq: 20 } } )
等同于
db.inventory.find( { qty: 20 } )
结果
例子:查找name字段的值等于ab的记录(应为name属于item,所以这种形式也成为了嵌入式属性的查询),对应官网【Match a Document Value】
查询语句:
db.inventory.find( { "item.name": { $eq: "ab" } } )
例子:查找tags字段中(数组中)含有某一个值的记录
查询语句:
- db.inventory.find( { tags: { $eq: "B" } } )
- //等同于
- db.inventory.find( { tags: "B" } )
结果
当查找的字段为数组时,当查询条件只有一个值时候,只要这个值包含在数组中就行。但如果查询的条件为多个值时,那么只有查询规则就会有变化,看下面的例子
例子:查找tags字段中(数组中)含有某个数组的记录,对应官网【Match an Array Value】
当查询条件是一个数组时,那么只有字段中有一个数组与之完全相同才满足条件。
查询语句:
- db.inventory.find( { tags: { $eq: [ "A", "B" ] } } )
- //等同于
- db.inventory.find( { tags: [ "A", "B" ] } )
结果:
- { _id: 3, item: { name: "ij", code: "456" }, qty: 25, tags: [ "A", "B" ] }
- { _id: 5, item: { name: "mn", code: "000" }, qty: 20, tags: [ [ "A", "B" ], "C" ] }
结果中可以发现,A,B都是没有其他值的数组,只要含有A,B的数组中有其他值都不满足。结果中的第二条记录满足是因为C大数组中的一部分,而不含在A,B这个数组中。
例子:查询条件是正则表达式,对应官网【Regex Match Behaviour】
在mongodb中正则表达式用 /表达式/ 这种方式来表示。当我们是用$eq时,双斜杠会被当成字符串的一部分,而不会当做正则表达式。这点一定要注意。
要在$eq中使用正则表达式,必须同时使用$regex(这属于显式执行),下面看例子:
创建一个company表,插入数据如下:
- { _id: 001, company: "MongoDB" }
- { _id: 002, company: "MongoDB2" }
执行正则表达式的查询:
- db.company.find( { company: { $regex: /MongoDB/ } }, {_id: 0 } )
- // {_id: 0 }表示查询结果不显示id字段
执行结果:
另外一种隐式的使用正则表达式的方式就是不要使用$eq,如下:
db.company.find( { company: /MongoDB/ }, {_id: 0 } ) // {_id: 0 }表示查询结果不显示id字段
这种方式属于隐式执行(不使用$regex)
=======================================================================
●$gt
$gt比较符用来查询出指定字段的值大于特定值的那些记录,语法如下:
{ field: { $gt: value } }
先导入下面的数据源:
- db.inventory.insertMany( [
- {
- "item": "nuts", "quantity": 30,
- "carrier": { "name": "Shipit", "fee": 3 }
- },
- {
- "item": "bolts", "quantity": 50,
- "carrier": { "name": "Shipit", "fee": 4 }
- },
- {
- "item": "washers", "quantity": 10,
- "carrier": { "name": "Shipit", "fee": 1 }
- }
- ] )
然后通过例子来讲解。
例子:查询quantity
大于20的记录
db.inventory.find( { quantity: { $gt: 20 } } )
执行结果:
例子:查询出carrier.fee值大于2的记录,给这个记录添加一个price字段,并给price字段的值设置为9.99
- db.inventory.updateOne(
- { "carrier.fee": { $gt: 2 } }, { $set: { "price": 9.99 } }
- )
执行结果:
注意:因为我们用的是updateOne,所以只讲第一条满足条件的记录添加了price字段。
=======================================================================
●$gte
$gte就是大于等于的意思,具体语法如下:
{ field: { $gte: value } }
具体用法更上面的$gt一样,这里就不做例子和说明了。
=======================================================================
●$in
{ field: { $in: [, , ... ] } }
$in操作符所用:当表中记录的指定字段的值等于$in指定的数组里的任何一个值时,这条记录就满足条件,会被查询出来。
例子:
首先创建表,插入基础数据:
- db.inventory.insertMany( [
- { "item": "Pens", "quantity": 350, "tags": [ "school", "office" ] },
- { "item": "Erasers", "quantity": 15, "tags": [ "school", "home" ] },
- { "item": "Maps", "tags": [ "office", "storage" ] },
- { "item": "Books", "quantity": 5, "tags": [ "school", "storage", "home" ] }
- ] )
例子1:查询quantity字段的值等于5或者15的记录
mytest> db.inventory.find( { quantity: { $in: [ 5, 15 ] } }, { _id: 0 } )
结果
这个$in的用法感觉跟or很相似,但是当对一个字段进行操作的时候(比如此处的5或者15都是值同一个字段quantity),一般用$in。
例子2:将tags中含有school或者home的记录添加一个exclude字段并设置为false
- db.inventory.updateMany(
- { tags: { $in: [ "home", "school" ] } },
- { $set: { exclude: false } }
- )
结果:
例子3:在$in操作附中使用正则表达式,查询tags字段中以be或者st开头的记录
db.inventory.find( { tags: { $in: [ /^be/, /^st/ ] } } )
结果:
=======================================================================
●$lt
{ field: { $lt: value } }
$lt等同于sql中的小于号的意思。用来查询出指定字段的值小于特定值的那些记录。
用法与$gt完全相同,这里就不在编写例子,可以直接使用$gt中的数据进行测试就行。
=======================================================================
●$lte
{ field: { $lte: value } }
$lte等同于sql中的小于等于的意思。用来查询出指定字段的值小于等于特定值的那些记录。
用法与$gte完全相同,这里就不在编写例子,可以直接使用$gte中的数据进行测试就行。
=======================================================================
●$ne
{ field: { $ne: value } }
$ne等同于sql中的不等于的意思。用来查询出指定字段的值不等于特定值的那些记录
例子:
首先,创建基础数据
- db.inventory.insertMany( [
- {
- "item": "nuts", "quantity": 30,
- "carrier": { "name": "Shipit", "fee": 3 }
- },
- {
- "item": "bolts", "quantity": 50,
- "carrier": { "name": "Shipit", "fee": 4 }
- },
- {
- "item": "washers", "quantity": 10,
- "carrier": { "name": "Shipit", "fee": 1 }
- }
- ] )
例子1:查询quantity不等于30的记录
db.inventory.find( { quantity: { $ne: 30 } } )
结果:
例子2:将carrier.fee不等于1的记录的price的价格设置为9.9
db.inventory.updateMany( { "carrier.fee": { $ne: 1 } }, { $set: { "price": 9.99 } } )
结果:
=======================================================================
●$nin
{ field: { $nin: [ , ... ] } }
$nin就是not in的意思。用来查询出指定字段的值不在$nin指定的数组中的记录或者这个指定字段本身就不存在的记录。
例子:
首先,创建基础数据
- db.inventory.insertMany( [
- { "item": "Pens", "quantity": 350, "tags": [ "school", "office" ] },
- { "item": "Erasers", "quantity": 15, "tags": [ "school", "home" ] },
- { "item": "Maps", "tags": [ "office", "storage" ] },
- { "item": "Books", "quantity": 5, "tags": [ "school", "storage", "home" ] }
- ] )
例子1:查询出quantity不等于5或者15的记录
db.inventory.find( { quantity: { $nin: [ 5, 15 ] } }, { _id: 0 } )
结果:
从结果可以看出,在开头处的定义说明。除了quantity的值不等于5或者15的会被查出来,没有quantity字段的也会被查出来
例子2:将tags中没有school的记录查询出来,添加exclude字段并设置值为true
- db.inventory.updateMany(
- { tags: { $nin: [ "school" ] } },
- { $set: { exclude: true } }
- )
结果:
到此,Mongodb的比较操作符就讲解完了,大家可以对照着官网的文档中[references]->[operators]->[query and projection operators]->[comparition query operators]来看我的这篇文章。