Mongodb数据查询 | Mongodb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
1.基本查询
    ①方法find():查询
        db.集合名称.find({条件文档})
    ②方法findOne():查询,只返回第一个
        db.集合名称.findOne({条件文档})
    ③方法pretty():将结果格式化
        db.集合名称.find({条件文档}).pretty()
2.比较运算符
    # 等于,默认是等于判断,没有运算符
    # 小于,$lt   less-than
    # 小于或等于,$lte   less-than,equal
    # 大于,$gt    greater-than
    # 小于或等于,$gte    greater-than,equal
    # 不等于,$ne    not equal 
        db.collection2.find({name:'郭靖'})
        db.collection2.find({age:{$gte:18}})
3.逻辑运算符
    ①逻辑与
        # 默认是逻辑与的关系
        # 例:查询年龄大于或等于18,并且性别为true的学生
            db.collection2.find({age:{$gte:18}, gender:true})
    ②逻辑或
        # 使用$or,值为数组,数组中每个元素为json
        # 例:查询年龄大于18,或性别为false的学生
            db.collection2.find({$or:[{age:{$gt:18}},{gender:false}]})
        注意点:find() >> 或条件下的{} >> $or[ ] >>
        >>  {条件a},{条件b} >> {域:{ 逻辑符判断} }
    ③或、与共用
        # 例:查询年龄大于18或姓名是郭靖,并且性别为男生
            db.collection2.find( {$or:[ {age:{$gt:18} },{name:'郭靖'} ],gender:true} )
4.范围运算符
    # $in|$nin
    # 例:查询年龄为18,28的学生
        db.collection2.find( {age:{$in:[18, 28] } } )
    # 这里要注意了,最大与最小都需要表中含有这几个数
5.支持正则表达式
    # 使用 // 或 $regex 编写正则表达式
    # 例:db.collection2.find( {name:/^黄/} )
        db.collection2.find( {name:{$regex:'^黄'} } )
6.自定义查询
    # 使用$where后面写一个函数,返回满足条件的数据
    # 例:查询大于30岁的学生
        db.collection2.find(
        {
        $where: function(){
        return this.age > 18
        }})
7.Limit和Skip
    ①方法limit():读取指定数量的文档
        # db.集合名称.find().limit(NUMBER)
        db.collection2.find().limit(2)
        # 附:如果指定参数则显示集合中的所有文档
    ②方法skip():用于跳过指定数量的文档
        # db.集合名称.find().skip(NUMBER)
        db.stu.find().skip(2)
        # 附:参数NUMBER表示跳过的记录条数,默认为0
    ③limit()与skip()一起使用
        # 不分先后顺序;跳过指定数量文档,再读取指定数量的文档
        # 查询数据
        db.collection1.find().limit(4).skip(5)
        db.collection1.find().skip(5).limit(4)
8.投影
    --选择字段显示数据
        # ①db.集合名称.find({},{ 字段名称:1, ...})
        db.collection2.find({},{name:1, gender:1})
        # '1':表示显示字段,不设置表示不显示
        # ②特殊:对于_id列默认是显示的,
        # 如果不显示需要明确设置为0
        db.collection2.find({},{_id:0,name:1,gender:1})
9.排序
    --对结果集进行排序
        参数1为升序排列
        参数-1位降序排列
    # db.集合名称.find().sort({字段:1....})
    # --根据性别降序,再根据年龄升序
        db.collection2.find().sort({gender:-1,age:1})
10.统计个数
    ①方法count():用于统计结果集中文档条数
        1.db.集合名称.find({条件}).count()
        db.collection2.find({gender:true}).count()
        # --统计男生人数
 
        2.db.集合名称.count({条件})
        db.collection2.count({age:{$gt:20}, gender:true})
        # --统计年龄大于20的男生人数
11.消除重复
    ①方法distinct():对字段数据进行去重,提取
    --db.集合名称.distinct('去重字段',{条件})
    db.collection2.distinct('hometown',{age:{$gt:18}})
    # 查询年龄大于18岁的学生,来自哪些省份
 
# 4.聚合查询
1.基本语法
    --语法
    db.集合名称.aggregate( {管道: {表达式} } )
    附:
        1.管道:在Unix和Linux中一般用于将当前命令的
        输出结果作为下一个命令的输入
        2.表达式:处理输入文档并输出
2.常用表达式
    $sum: 计算综合,$sum:1 表示以一倍计数
    $avg: 计算平均值
    $min: 获取最小值
    $max: 获取最大值
    $push: 在结果文档中插入值到第一个文档数据
    $first: 根据资源文档的排序获取第一个文档数据
    $last: 根据资源文档的排序获取最后一个文档数据
3.常用管道
    ①$group
        --将集合中的文档分组,可用于统计结果
        --_id表示分组的依据,使用某个字段的格式为'$字段'
            # 统计男生、女生的总人数
            db.stu.aggregate(
                {$group:
                    {
                        _id:'$gender',
                        counter:{$sum:1}
                    }
                }
            )
        --透视数据
            # 统计学生性别及学生姓名
            db.stu.aggregate(
                {$group:
                    {
                        _id:'$gender',
                        name:{$push:'$name'}
                    }
                }
            )
        --使用$$ROOT可以将文档内容加入到结果集的数组中
            db.stu.aggregate(
                {$group:
                    {
                        _id:'$gender',
                        name:{$push:'$$ROOT'}
                    }
                }
            )
    ②$match
        --修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
        --用于过滤数据,只输出符合条件的文档
        --使用MongoDB的标准查询操作
        # 查询年龄大于20的学生
        db.stu.aggregate(
            {$match:{age:{$gt:20}}}
        )
 
        # 查询年龄大于20的男生、女生人数
        db.stu.aggregate(
            {$match:{age:{$gt:20}}},
            {$group:{_id:'$gender',counter:{$sum:1}}}
        )
    ③$project
        --修改输入文档的结构,
           如重命名、增加、删除字段、创建计算结果
        # 查询学生的姓名、年龄
        db.stu.aggregate(
            {$project:{_id:0,name:1,age:1}}
        )
 
        # 查询男生、女生人数,输出人数
        db.stu.aggregate(
            {$group:{_id:'$gender',counter:{$sum:1}}},
            {$project:{_id:0,counter:1}}
        )
    ④$sort
        --将输入文档排序后输出
        # 查询学生信息,按年龄升序
        b.stu.aggregate({$sort:{age:1}})
 
        # 查询男生、女生人数,按人数降序
        db.stu.aggregate(
            {$group:{_id:'$gender',counter:{$sum:1}}},
            {$sort:{counter:-1}}
        )
    ⑤$limit和$skip
        --$limit
        # 限制聚合管道返回的文档数
        # 查询2条学生信息
            db.stu.aggregate({$limit:2})
 
        --$skip
        # 跳过指定数量的文档,并返回余下的文档
        # 查询从第3条开始的学生信息
            db.stu.aggregate({$skip:2})
 
        # 统计男生,女生人数,按人数升序,取第2条数据
            db.stu.aggregate(
                {$group:{_id:'$gender', counter:{$sum:1}}}
                {$sort:{counter:1}}
                {$skip:1}
                {$limit:1}
            )
    ⑥$unwind字段拆分查询
        --语法
        --文档中一个数组字段含有多个值
        --根据字段下的值拆分多条
        --每条包含数组中的一个值
            
        --db.集合名称.aggregate({$unwind:'$字段名称'})
            # $unwind聚合方法下含有两个属性:
                path:'$字段名称'
                preserveNullAndEmptyArrays:<布尔值>
            # 不填写属性,默认表示<布尔值>为false
            # 且不用标记属性名
        --构造数据
            db.t3.insert([
            { "_id" : 1, "item" : "a", "size": [ "S", "M", "L"] },
            { "_id" : 2, "item" : "b", "size" : [ ] },
            { "_id" : 3, "item" : "c", "size": "M" },
            { "_id" : 4, "item" : "d" },
            { "_id" : 5, "item" : "e", "size" : null }
            ])
        --查看查询结果,显示对空数组,无字段,null的文档
            db.t3.aggregate( { $unwind:{ path:'$size', preserveNullAndEmptArrays:true}})
 
        --查看查询结果,不显示空数组,无字段,null的文档
            db.t3.aggregate({$unwind: '$size'})  相当于:
            db.t3.aggregate({$unwind:{path:'$size', preserveNullAndEmptyArrays:false}})

  

posted @   挨踢人啊  阅读(1317)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!
历史上的今天:
2017-06-19 Android深入理解JNI(一)JNI原理与静态、动态注册
点击右上角即可分享
微信分享提示