MongoDB 查询和投影运算符

MongoDB 查询和投影运算符

近期在学习MongoDB时遇到了find()查询

其中在模糊查询和统计中我接触到新的东西

模糊查询

db.test.find({"name" : re.compile("d")})

db.test.find({"name" : {"$regex" : "d"}})

有相同的功能

统计

db.test.count_documents({"num" : {"$gt" : 1}}) 	# 查询 num 大于 1 的数据

那么 $regex 和 $gt 中的 $ 是什么? 还有哪些相似的语句呢?

1. 比较运算查询

Name Description
$eq 匹配等于指定值的值
$gt 匹配大于指定值的值
$gte 匹配大于或等于指定值的值
$lt 匹配小于指定值的值
$lte 匹配小于或等于指定值的值
$ne 匹配所有不等于指定值的值
$in 匹配数组中指定的任何值
$nin 不匹配数组中指定的任何值

关系运算

1.1 查询年龄为19的人
db.test.find({"age": {"$eq":19}})
1.2 查询年龄大于19的人
db.test.find({"age": {"$gt":19}})
1.3 查询年龄大于或等于19的人
db.test.find({"age": {"$gte":19}})
1.4 查询年龄小于19的人
db.test.find({"age": {"$lt":19}})
1.5 查询年龄小于或等于19的人
db.test.find({"age": {"$lte":19}})
1.6 查询年龄不等于19的人
db.test.find({"age": {"$ne":19}})

范围查询

1.7 查询姓名是 “张三”、“李四”、“王五” 的信息
db.test.find( {"name": {"$in": ["张三", "李四", "王五" ]}})
1.8 查询姓名不是 “张三”、“李四”、“王五” 的信息
db.test.find( {"name": {"$nin": ["张三", "李四", "王五" ]}})

2. 逻辑运算查询

Name Description
$and 将查询子句与逻辑子句联接,并返回与这两个子句的条件匹配的所有文档
$not 反转查询表达式的效果并返回与查询表达式不匹配的文档
$nor 使用逻辑NOR联接查询子句将返回与这两个子句都不匹配的所有文档
$or 将查询子句与逻辑或联接,返回与任一子句的条件匹配的所有文档
2.1 查询年龄在 19 ~ 25 之间的人

在进行逻辑运算的时候 “and” 操作是最容易,直接使用 “,”分割即可

db.test.find( {"$and": [ {"age": {"$gte" : 19} }, {"age": {"$lte": 25 }}]})
# 等价于
db.test.find({"age": {"$gte": 19, "$lte": 25 }})
2.2 查询年龄不大于19的人

$not 操作符不能独立使用,必须跟其他操作一起使用(除 $regex)

db.test.find( { "age": { "$not": { "$gt": 19 } } } ) 
# 等同于
db.test.find( { "age": { "$lte": 19 } } )
2.3 查询年龄大于25或年龄小于19的人
db.test.find( {"$or": [ {"age": {"$lt" : 19} }, {"age": {"$gt": 25 } } ] })
2.4 查询年龄在19 ~ 25 之间的人
db.test.find( {"$nor": [ {"age": {"$lt" : 19} }, {"age": {"$gt": 25 } } ] })

3. 要素查询

Name Description
$exists 匹配具有指定字段的文档
$type 如果字段属于指定类型,则选择文档

$exists

如果 $exists 的值为true,选择存在该字段的文档;若值为 false 则选择不包含该字段的文档。

3.1 查询不存在 age 字段的文档(所有文档)
db.test.find( { "age": { "$exists" : false } })
3.2 查询 age 字段存在,且值不等于 19 和 25 的文档
db.test.find( { "age": { "$exists" : true, $nin: [ 19, 25 ] } } 

$type

操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果

3.3 获取 “test” 集合中 name 为 String 的数据
db.test.find({"name" : {$type : 2}})
# 等价于
db.test.find({"name" : {$type : 'string'}})
类型 数字 备注
Double 1
String 2
Object 3
Array 4
Binary data 5
Undefined 6 已废弃
Object id 7
Boolean 8
Date 9
Null 10
Regular Expression 11
JavaScript 13
Symbol 14
JavaScript (with scope) 15
32-bit integer 16
Timestamp 17
64-bit integer 18
Min key 255 Query with -1.
Max key 127

4. 评估查询

Name Description
$expr 允许在查询语言中使用聚合表达式
$jsonSchema 根据给定的JSON模式验证文档
$mod 对字段的值执行模运算,并选择具有指定结果的文档
$regex 选择值与指定正则表达式匹配的文档
$text 执行文本搜索
$where 匹配满足JavaScript表达式的文档
4.1 $expr 使用 $expr 运算符联合多个运算,选出 budget 值大于 spent 值的数据
{ "_id" : 1, "category" : "food", "budget": 400, "spent": 450 }
{ "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 }
{ "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 }
{ "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 }
{ "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 }
db.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
4.2 $jsonSchema
db.createCollection("students", {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         required: [ "name", "year", "major", "gpa" ],
         properties: {
            name: {
               bsonType: "string",
               description: "must be a string and is required"
            },
            gender: {
               bsonType: "string",
               description: "must be a string and is not required"
            },
            year: {
               bsonType: "int",
               minimum: 2017,
               maximum: 3017,
               exclusiveMaximum: false,
               description: "must be an integer in [ 2017, 3017 ] and is required"
            },
            major: {
               enum: [ "Math", "English", "Computer Science", "History", null ],
               description: "can only be one of the enum values and is required"
            },
            gpa: {
               bsonType: [ "double" ],
               description: "must be a double and is required"
            }
         }
      }
   }
})

参考

https://blog.csdn.net/newbie_907486852/article/details/82528746

4.3 $mod 查询集合中 amount 键值为 4 的 0 次模数的所有文档
db.inventory.find( { amount: { $mod: [ 4, 0 ] } } )
# 例如 amount 值等于 16 的文档
{"name":"t1", "amount":16, "tags":[ "school", "book", "bag", "headphone", "appliances" ]}
4.4 $regex 查询中可以对字符串执行正则匹配

比如刚开始的例子

db.test.find({"name" : re.compile("d")})

对于 options 主要是设置正则的信息查询的标记:

  • “i”: 忽略字母大小写
  • “m”: 忽多行查找
  • “x”: 空白字符串除了被转义的或在字符类中意外的完全被忽略
  • “s”:匹配所有的字符(圆点,“.”),包括换行内容

如果是直接使用(javaScript)那么只能够使用 “i” 与 “m”,而 “x” 和 “s” 必须使用 “$regex”

查询name键值以“4”结尾的文档

db.inventory.find( { name: /.4/i } );
# 等价于
db.inventory.find( { name: { $regex: '.4', $options: 'i' } } );
4.5 $text 匹配文本中含有modeng的BSON
db.test.find( { $text: { $search: "modeng" } } )
4.6 $where

他可以使用任意的JavaScript作为查询的一部分,包含JavaScript表达式的字符串或者JavaScript函数。

新建fruit集合并插入如下文档:

//插入两条数据
db.fruit.insert({"apple":1, "banana": 4, "peach" : 4})
db.fruit.insert({"apple":3, "banana": 3, "peach" : 4})

比较文档中的两个键的值是否相等.例如查找出banana等于peach键值的文档(4种方法):

//JavaScrip字符串形式
db.fruit.find( { $where: "this.banana == this.peach" } )
db.fruit.find( { $where: "obj.banana == obj.peach" } )
//JavaScript函数形式
db.fruit.find( { $where: function() { return (this.banana == this.peach) } } )
db.fruit.find( { $where: function() { return obj.banana == obj.peach; } } )

查出文档中存在的两个键的值相同的文档,JavaScript函数会遍历集合中的文档:

>db.fruit.find({$where: function () {
    for (var current in this) {
        for (var other in this) {
            if (current != other && this[current] == this[other]) {
            return true;
            }
        }
    }
    return false;
}});

我们尽量避免使用"Where"査询,因为它们在速度上要比常规査询慢很多。每个文档都要从BSON转换成JavaScript对象,然后通过"where"的表达式来运行;同样还不能利用索引。

5. 地理空间

Name Description
$geoIntersects 选择与GeoJSON几何体相交的几何体。2dsphere索引支持$geoIntersects
$geoWithin 选择边界GeoJSON几何图形中的几何图形。2dsphere和2d索引支持$geoinfin
$near 返回接近点的地理空间对象。需要地理空间索引。2dsphere和2d索引支持$near
$nearSphere 返回接近球点上的地理空间物体。需要地理空间索引。2dsphere和2d索引支持$nearSphere

有点高深,等有需求时补充

6. 阵列

Name Description
$all 匹配包含查询中指定的所有元素的数组
$elemMatch 如果数组字段中的元素与所有指定的$elemMatch条件匹配,则选择文档
$size 如果数组字段是指定大小,则选择文档
6.1 $all 返回tags数组中含有"appliance", “school”, “book”(必须要是全部包含)的所有bson
db.inventory.find( { tags: { $all: [ "appliance", "school", "book" ] } } )
6.2 $elemMatch 返回tags数组中,所有元素大于等于80小于85的数据
db.scores.find({ tags: { $elemMatch: { $gte: 80, $lt: 85 } } })
6.3 $size 返回tags数组中有两个元素的bson
db.collection.find( { tags: { $size: 2 } } );

7. 按位

Name Description
$bitsAllClear 匹配一组位位置的值都为0的数值或二进制值
$bitsAllSet 匹配一组位位置的值都为1的数值或二进制值
$bitsAnyClear 匹配数值或二进制值,其中来自一组位位置的任何位的值为0
$bitsAnySet 匹配数值或二进制值,其中来自一组位位置的任何位的值为1

8. 评论

Name Description
$comment 向查询语句添加注释

投影算符

Name Description
$ 在与查询条件匹配的数组中投影第一个元素
$elemMatch 投影数组中与指定的$elemMatch条件匹配的第一个元素。
$meta 投影在$text操作期间分配的文档分数
$slice 限制从数组投影的元素数。支持跳过和限制切片

参考

https://docs.mongodb.com/manual/reference/operator/query/
https://blog.csdn.net/newbie_907486852/article/details/82528746
https://blog.csdn.net/qq_18948359/article/details/88251592

你可能感兴趣的:(MongoDB)