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


    本文将会介绍 MongoDB 中的逻辑运算符,包括 $and、$or、$not 以及 $nor。

    $and 运算符

    $and 是一个逻辑查询运算符,可以基于一个或多个表达式执行逻辑 AND 操作。

    $and 运算符的语法如下:

    $and :[{expression1}, {expression2},...]
    
    • 1

    如果所有的表达式结果都为 true,$and 运算符返回 true。

    $and 运算符从左至右计算表达式的值,只要有一个表达式为 false,就会结束运算并返回 false。这种实现方法被称为短路运算(short-circuit evaluation)。

    另外,当我们使用逗号分隔的表达式列表时,MongoDB 也会执行隐式逻辑 AND 操作:

    { field: { expression1, expression2, ... }
    
    • 1

    接下来的示例我们将会使用 products 集合:

    db.products.insertMany([
    	{ "_id" : 1, "name" : "xPhone", "price" : 799, "releaseDate" : ISODate("2011-05-14T00:00:00Z"), "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-01T00:00:00Z"), "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-14T00:00:00Z"), "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-14T00:00:00Z"), "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-14T00:00:00Z"), "spec" : { "ram" : 4, "screen" : 9.7, "cpu" : 1.66 }, "color" : [ "white", "orange", "gold", "gray" ], "storage" : [ 128, 256 ] },
    	{ "_id" : 6, "name" : "xWidget", "spec" : { "ram" : 64, "screen" : 9.7, "cpu" : 3.66 }, "color" : [ "black" ], "storage" : [ 1024 ] }
    ])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    下面的示例使用 $and 运算符查找集合 products 中满足以下条件的文档:

    • price 字段的值等于 899;
    • 并且 field 字段包含“white”或者“black”。
    db.products.find({
        $and: [{
            price: 899
        }, {
            color: {
                $in: ["white", "black"]
            }
        }]
    }, {
        name: 1,
        price: 1,
        color: 1
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    查询返回的文档如下:

    [
      {
        _id: 2,
        name: 'xTablet',
        price: 899,
        color: [ 'white', 'black', 'purple' ]
      }
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    以下示例使用 $and 运算符查找 price 字段值等 699 并且该字段存在的文档:

    db.products.find({
        $and: [{
            price: 699
        }, {
            price: {
                $exists: true
            }
        }]
    }, {
        name: 1,
        price: 1,
        color: 1
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    输出结果如下:

    [
      {
        _id: 4,
        name: 'SmartPad',
        price: 699,
        color: [ 'white', 'orange', 'gold', 'gray' ]
      }
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    我们也可以使用隐式逻辑 AND 运算符实现相同的效果:

    db.products.find({
        price: {
            $eq: 699,
            $exists: true
        }
    }, {
        name: 1,
        price: 1,
        color: 1
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    $exists 运算符用于判断指定字段是否存在。

    $or 运算符

    $or 是一个逻辑查询运算符,可以基于一个或多个表达式执行逻辑 OR 操作,返回至少满足一个表达式的文档。

    $or 运算符的语法如下:

    $or:[{expression1}, {expression2},...]
    
    • 1

    下面的示例使用 $or 运算符查找集合 products 中价格等于 799 或者 899 的产品:

    db.products.find({
        $or: [{
            price: 799
        }, {
            price: 899
        }]
    }, {
        name: 1,
        price: 1
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    查询返回的文档如下:

    [
      { _id: 1, name: 'xPhone', price: 799 },
      { _id: 2, name: 'xTablet', price: 899 },
      { _id: 3, name: 'SmartTablet', price: 899 }
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    以上示例使用了相同的字段进行过滤,因此我们也可以使用 $in 运算符:

    db.products.find({
        price: {
            $in: [799, 899]
        }
    }, {
        name: 1,
        price: 1
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    下面的示例使用 $or 运算符查找价格小于 699 或者大于 799 的产品:

    db.products.find({
        $or: [
            { price: {$lt: 699} },
            { price: {$gt: 799} }
        ]
    }, {
        name: 1,
        price: 1
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    输出结果如下:

    [
      { _id: 2, name: 'xTablet', price: 899 },
      { _id: 3, name: 'SmartTablet', price: 899 },
      { _id: 5, name: 'SmartPhone', price: 599 }
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    $not 运算符

    $not 是一个逻辑查询运算符,可以将一个表达式的结果进行逻辑 NOT 运算,返回不满足条件的文档,包括那些不存在指定字段的文档。

    $not 运算符的语法如下:

    { field: { $not: { <expression> } } }
    
    • 1

    以下示例使用 $not 运算符查找 price 字段小于等于 699,或者不存在 price 字段的文档:

    db.products.find({
        price: {
            $not: {
                $gt: 699
            }
        }
    }, {
        name: 1,
        price: 1
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    查询返回的文档如下:

    [
      { _id: 4, name: 'SmartPad', price: 699 },
      { _id: 5, name: 'SmartPhone', price: 599 },
      { _id: 6, name: 'xWidget' }
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意,{ $not: { $gt: 699 } } 的逻辑和 $lte 运算符不同。{ $lte : 699 } returns 返回的是 price 字段存在并且小于等于 699 的文档。

    以下示例使用 $not 运算符查找 name 字段不匹配正则表达式 /^Smart+/ 的文档:

    db.products.find({
        name: {
            $not: /^Smart+/
        }
    }, {
        name: 1
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    正则表达式 /^Smart+/ 匹配以“Smart”开头的字符串。查询返回的文档如下:

    [
      { _id: 1, name: 'xPhone' },
      { _id: 2, name: 'xTablet' },
      { _id: 6, name: 'xWidget' }
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    $nor 运算符

    $nor 是一个逻辑查询运算符,可以基于一个或多个表达式执行逻辑 NOR 运算,返回不满足所有条件的文档。

    $nor 运算符的语法如下:

    { $nor: [ { <expression1> }, { <expression2> },...] }
    
    • 1

    以下示例使用 $nor 运算符查询价格不等于 899,并且颜色不包含“gold”的产品:

    db.products.find({
        $nor :[
            { price: 899},
            { color: "gold"}
        ]
    }, {
        name: 1,
        price: 1, 
        color: 1
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    与 $not 运算符类似,$nor 运算符也会返回指定字段不存在的文档。

    查询返回的结果如下:

    { "_id" : 1, "name" : "xPhone", "price" : 799, "color" : [ "white", "black" ] }
    { "_id" : 6, "name" : "xWidget", "color" : [ "black" ] }
    
    • 1
    • 2
  • 相关阅读:
    面试笔试题之Linux部分58题(第二部分)
    学习HashMap源码
    2118. Build the Equation
    UE基础篇十:材质
    Pymoo学习 (1):基本概念
    INC公司和LLC公司的区别
    十三、泛型
    期货权益可用资金(期货的权益和可用资金)
    MySQL数据库——存储过程-游标(介绍-声明游标、打开游标、获取游标记录、关闭游标,案例)
    ElementUI之el-table标题列中显示el-tooltip
  • 原文地址:https://blog.csdn.net/horses/article/details/125973994