• [Mongodb 5.0]比较运算符


    前言

    本章节对应的是官网【Comparison Query Operators — MongoDB Manual

    正文

    比较运算符有以下几个:

    Name

    Description

    $eq

    等于

    $gt

    大于

    $gte

    大于等于

    $in

    包含

    $lt

    小于

    $lte

    小于等于

    $ne

    不等于

    $nin

    不在数组中

     ● $eq

    $eq用来查找出字段的值等于指定值的记录。

    用法:

    { : { $eq:  } }
    

    例子:查找出qty字段的值等于20的记录,对应官网【Match a Document Value】

    数据源:

    1. { _id: 1, item: { name: "ab", code: "123" }, qty: 15, tags: [ "A", "B", "C" ] }
    2. { _id: 2, item: { name: "cd", code: "123" }, qty: 20, tags: [ "B" ] }
    3. { _id: 3, item: { name: "ij", code: "456" }, qty: 25, tags: [ "A", "B" ] }
    4. { _id: 4, item: { name: "xy", code: "456" }, qty: 30, tags: [ "B", "A" ] }
    5. { _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字段中(数组中)含有某一个值的记录

    查询语句:

    1. db.inventory.find( { tags: { $eq: "B" } } )
    2. //等同于
    3. db.inventory.find( { tags: "B" } )

    结果

     当查找的字段为数组时,当查询条件只有一个值时候,只要这个值包含在数组中就行。但如果查询的条件为多个值时,那么只有查询规则就会有变化,看下面的例子

    例子:查找tags字段中(数组中)含有某个数组的记录,对应官网【Match an Array Value】
    当查询条件是一个数组时,那么只有字段中有一个数组与之完全相同才满足条件。

    查询语句:

    1. db.inventory.find( { tags: { $eq: [ "A", "B" ] } } )
    2. //等同于
    3. db.inventory.find( { tags: [ "A", "B" ] } )

    结果:

    1. { _id: 3, item: { name: "ij", code: "456" }, qty: 25, tags: [ "A", "B" ] }
    2. { _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表,插入数据如下:

    1. { _id: 001, company: "MongoDB" }
    2. { _id: 002, company: "MongoDB2" }

    执行正则表达式的查询:

    1. db.company.find( { company: { $regex: /MongoDB/ } }, {_id: 0 } )
    2. // {_id: 0 }表示查询结果不显示id字段

    执行结果:

    另外一种隐式的使用正则表达式的方式就是不要使用$eq,如下:

    db.company.find( { company: /MongoDB/ }, {_id: 0 } ) // {_id: 0 }表示查询结果不显示id字段

    这种方式属于隐式执行(不使用$regex)

    =======================================================================

    $gt

    $gt比较符用来查询出指定字段的值大于特定值的那些记录,语法如下:

    { field: { $gt: value } }

    先导入下面的数据源: 

    1. db.inventory.insertMany( [
    2. {
    3. "item": "nuts", "quantity": 30,
    4. "carrier": { "name": "Shipit", "fee": 3 }
    5. },
    6. {
    7. "item": "bolts", "quantity": 50,
    8. "carrier": { "name": "Shipit", "fee": 4 }
    9. },
    10. {
    11. "item": "washers", "quantity": 10,
    12. "carrier": { "name": "Shipit", "fee": 1 }
    13. }
    14. ] )

    然后通过例子来讲解。

    例子:查询quantity 大于20的记录

    db.inventory.find( { quantity: { $gt: 20 } } )
    

    执行结果:

     例子:查询出carrier.fee值大于2的记录,给这个记录添加一个price字段,并给price字段的值设置为9.99

    1. db.inventory.updateOne(
    2. { "carrier.fee": { $gt: 2 } }, { $set: { "price": 9.99 } }
    3. )

    执行结果:

     注意:因为我们用的是updateOne,所以只讲第一条满足条件的记录添加了price字段。

    =======================================================================

    ●$gte

    $gte就是大于等于的意思,具体语法如下:

    { field: { $gte: value } }

    具体用法更上面的$gt一样,这里就不做例子和说明了。

    =======================================================================

    ●$in

    { field: { $in: [, , ...  ] } }
    

    $in操作符所用:当表中记录的指定字段的值等于$in指定的数组里的任何一个值时,这条记录就满足条件,会被查询出来。 

    例子:

    首先创建表,插入基础数据:

    1. db.inventory.insertMany( [
    2. { "item": "Pens", "quantity": 350, "tags": [ "school", "office" ] },
    3. { "item": "Erasers", "quantity": 15, "tags": [ "school", "home" ] },
    4. { "item": "Maps", "tags": [ "office", "storage" ] },
    5. { "item": "Books", "quantity": 5, "tags": [ "school", "storage", "home" ] }
    6. ] )

    例子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

    1. db.inventory.updateMany(
    2. { tags: { $in: [ "home", "school" ] } },
    3. { $set: { exclude: false } }
    4. )

    结果:

     例子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中的不等于的意思。用来查询出指定字段的值不等于特定值的那些记录

    例子:

    首先,创建基础数据

    1. db.inventory.insertMany( [
    2. {
    3. "item": "nuts", "quantity": 30,
    4. "carrier": { "name": "Shipit", "fee": 3 }
    5. },
    6. {
    7. "item": "bolts", "quantity": 50,
    8. "carrier": { "name": "Shipit", "fee": 4 }
    9. },
    10. {
    11. "item": "washers", "quantity": 10,
    12. "carrier": { "name": "Shipit", "fee": 1 }
    13. }
    14. ] )

    例子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指定的数组中的记录或者这个指定字段本身就不存在的记录。

    例子:

    首先,创建基础数据

    1. db.inventory.insertMany( [
    2. { "item": "Pens", "quantity": 350, "tags": [ "school", "office" ] },
    3. { "item": "Erasers", "quantity": 15, "tags": [ "school", "home" ] },
    4. { "item": "Maps", "tags": [ "office", "storage" ] },
    5. { "item": "Books", "quantity": 5, "tags": [ "school", "storage", "home" ] }
    6. ] )

    例子1:查询出quantity不等于5或者15的记录

    db.inventory.find( { quantity: { $nin: [ 5, 15 ] } }, { _id: 0 } )
    

    结果:

     从结果可以看出,在开头处的定义说明。除了quantity的值不等于5或者15的会被查出来,没有quantity字段的也会被查出来

    例子2:将tags中没有school的记录查询出来,添加exclude字段并设置值为true

    1. db.inventory.updateMany(
    2. { tags: { $nin: [ "school" ] } },
    3. { $set: { exclude: true } }
    4. )

    结果:

     

    到此,Mongodb的比较操作符就讲解完了,大家可以对照着官网的文档中[references]->[operators]->[query and projection operators]->[comparition query operators]来看我的这篇文章。

  • 相关阅读:
    iPhone苹果15手机怎么看是国行还是美版或港版的苹果iPhone15手机?
    《异 步》
    Pytest+Allure+Anywhere:测试报告生成后本地运行,分享给局域网内其他同事查阅
    局域网电脑共享设备或文件时显示无法访问并提示无权限之解决方法
    玩转SQLite7:基本语法与数据类型
    Mit6.006-problemSet01
    vue el-input框实现根据不同编号显示不同值
    Ruoyi从mysql切换到postgresql的几个坑
    集线器与交换机的区别
    我用Python写个适合自己游戏的协议测试(接口测试)工具/抓包工具
  • 原文地址:https://blog.csdn.net/liuhaibo_ljf/article/details/126744592