当前位置:网站首页>04 MongoDB各种查询操作 以及聚合操作总结
04 MongoDB各种查询操作 以及聚合操作总结
2022-06-28 03:22:00 【cui_yonghua】
目录:基础篇(能解决工作中80的问题)
01 MongoDB的概述、应用场景、下载方式、连接方式和发展历史等
02 MongoDB数据类型、重要概念以及shell常用指令
一. 使用 find() 方法查询文档
语法格式: db.collection.find(query, projection)
说明: find()方法以非结构化的方式来显示所有文档, 可指定参数:
query
: 可选,使用查询操作符指定查询条件;projection
: 可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
案例1: 如向集合user_demo中查询名字为zhangsan的用户:
db.user_demo.find({
'name':'zhangsan'})
# 相当于sql中的
select * from user_demo where name = "zhangsan";
案例2: 指定返回哪些键
db.article.find({
}, {
"title": 1, "author": 1})
# 相当于sql中的
select title, author from article;
除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档。
二. AND查询和OR查询
2.1 AND查询
AND查询语法格式: db.col.find({key1:value1, key2:value2})
案例1: 如向集合user_demo中查询名字为zhangsan的用户且age为20的数据:
db.user_demo.find({
'name':'zhangsan', 'age': 20})
# 相当于sql中的
select * from user_demo where name = "zhangsan" and age = 20;
2.2 OR查询
OR查询语法格式:
db.col.find(
{
$or: [
{
key1: value1}, {
key2:value2}
]
}
)
案例2: 如向集合user_demo中查询名字为zhangsan的用户或age为20的数据:
db.user_demo.find({
$or:[{
'name':'zhangsan', 'age': 20}]})
# 相当于sql中的
select * from article where name = "zhangsan" or age = 20;
案例3: AND和OR联合使用案例,类似常规SQL语句为:
db.col.find({
"likes": {
$gt:50}, $or: [{
"by": "xx教程"},{
"title": "MongoDB 教程"}]})
# 相当于sql中的
select * from col where likes>50 AND (by = 'xx教程' OR title = 'MongoDB 教程');
三. 条件操作符
3.1 比较条件
MongoDB中条件操作符有:
(>) 大于 - $gt
(<) 小于 - $lt
(>=) 大于等于 - $gte
(<= ) 小于等于 - $lte
案例1: 获取 “col” 集合中 “likes” 大于 100 的数据:
db.col.find({
likes : {
$gt : 100}})
# 相当于sql中的
select * from col where likes > 100;
案例2: 获取"col"集合中 “likes” 大于等于 100 的数据:
db.col.find({
likes : {
$gte : 100}})
# 相当于sql中的
select * from col where likes >= 100;
案例3: 获取"col"集合中 “likes” 小于 150 的数据:
db.col.find({
likes : {
$lt : 150}})
# 相当于sql中的
select * from col where likes < 150;
案例4: 获取"col"集合中 “likes” 小于等于 150 的数据:
db.col.find({
likes : {
$lte : 150}})
# 相当于sql中的
select * from col where likes <= 150;
案例5: 获取"col"集合中 “likes” 大于100,小于 200 的数据:
db.col.find({
likes : {
$lt :200, $gt : 100}})
# 相当于sql中的
select * from col where likes > 100 and likes < 200;
案例6: 获取"col"集合中 “likes” 不等于100的数据:
db.col.find({
likes : {
"$ne": 100}})
# 相当于sql中的
select * from col where likes != 100;
3.2 in
条件
select * from article where author in ("a", "b", "c")
# 相当于sql中的
db.article.find({
"author": {
"$in": ["a", "b", "c"]}})
3.3 like
条件查询
db.article.find({
"title": /mongodb/})
# 相当于sql中的
select * from article where title like "%mongodb%"
四. limit() 方法与 skip() 方法
4.1 控制返回数量 limit() 方法
语法格式(limit):db.COLLECTION_NAME.find().limit(NUMBER)
如显示查询文档中的两条记录:
db.col.find({
},{
"title":1}).limit(2)
除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。
4.2 略过数量 skip() 方法
语法格式:db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
以下实例只会显示第二条文档数据:
db.col.find({
},{
"title":1).limit(1).skip(1)
# 下面是略过前5条数据,也就是从第6条开始返回。
db.article.find().skip(5)
注:skip()方法默认参数为 0 。
4.3 limit和skip结合
可以结合limit()和skip()来达到分页效果:
db.article.find().skip(10).limit(20)
# 相当于sql中的
select * from article limit 10, 20;
五. 排序 sort() 方法
在 MongoDB 中使用 sort() 方法对数据进行排序。
sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。
语法格式:db.COLLECTION_NAME.find().sort({KEY:1})
如在 col 集合中的数据按字段 likes 的降序排列:
db.col.find({
},{
"title":1}).sort({
"likes":-1})
# 相当于sql中的
select * from col where title = 1 order by likes desc;
注意:skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()。
六. $type 操作符
6.1 MongoDB 中可以使用的类型如下表所示:
- 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
案例: 获取 “col” 集合中 title 为 String 的数据:db.col.find({"title" : {$type : 2}})
或db.col.find({"title" : {$type : 'string'}})
6.2 多个元素的查询
案例: 只有type数组同时存在mongodb和javascript才会匹配。
db.article.find({
"type": {
"$all": ["mongodb", "javascript"]}})
6.3 限制数组长度查询
案例: 只有数组的长度是2才会匹配, 注:type_list必须是数组
db.article.find({
"type_list": {
"$size": 2}})
6.4 返回特定数量
当$slice
的参数是一个时,表示返回的数量;当是一个数组时,第一个参数表示偏移量,第二个表示返回的数量:
案例:返回特定数量, 注:$slice针对的是数组
db.article.find({
"type": {
"$slice": 1}}) // 返回第1个
db.article.find({
"type": {
"$slice": -1}}) // 返回最后一个
db.article.find({
"type": {
"$slice": [20, 10]}}) // 从第21个开始,返回10个,也就是21~30
更多类型可以参考:mongodb $type
七. MongoDB特有的语句
7.1 元素匹配 ($elemMatch)
如果文档中有一个字段的值是数组,可以使用$elemMatch
来匹配数组内的元素:
案例:只有a=1且b>2才会匹配。
db.article.find({
"kown": {
"$elemMatch": {
a: 1, b: {
"$gt": 2}}}})
7.2 取模($mod)
比如我们要匹配 read % 5 == 1:
db.article.find({
"read": {
$mod: [5, 1]}})
7.3 是否存在($exists)
如果我们要判断love字段是否存在,可以这样:
# 如果存在字段love,就返回
db.article.find({
"love": {
"$exists": true}})
# 我们也可以判断不存在, 如果不存在字段love,就返回
db.article.find({
"love": {
"$exists": false}})
7.4 正则表达式
mongodb支持正则表达式,使用方法与正则字面量一样:
# i是忽略大小写
db.article.find({
"title": /mongodb/i})
7.5 类型查询
我们可以根据字段类型来返回数据:
# 只有当comments的类型是数组才匹配
db.article.find({
"comments": {
"$type": 4}})
7.6 内嵌文档
mongodb是允许内嵌文档的,而且要查询内嵌文档也很简单(使用点语法):
{
address: {
name: "nanji" }
}
db.article.find({
"address.name": "nanji"})
数组也可以采取点语法:
{
comments: [{
title: "mongodb"}, {
title: "javascript"}]
}
db.article.find({
"comments.title": "mongodb"})
7.7 取反
$not是元语句,即可以用在任何其他条件之上:
db.article.find({
"author": {
"$not": /mongodb/i}})
只要使用$not操作符,就表示取反。
7.8 统计
返回匹配数据的长度:
db.article.find().count()
7.9 格式化
pretty()方法可以以格式化的方式显示所有文档:
db.article.find().pretty()
️ 如果觉得有用,感谢一键三连哦 !!!️
边栏推荐
- 【Linux】【Mysql】ERROR 1698 (28000): Access denied for user ‘root‘@‘localhost‘
- 小程序输入框闪动?
- 多线程与高并发三:AQS底层源码分析及其实现类
- ambari SSLError: Failed to connect. Please check openssl library versions.
- 【毕业季】研究生の毕业总结
- Arrangement of basic electrical knowledge (II)
- Chapter IX app project test (3) test tools
- 月赛补题
- 测不准原理
- English语法_形容词/副词3级-比较级_常用短语
猜你喜欢
随机推荐
数组的方法
Understanding and learning of parental delegation mechanism
多线程与高并发三:AQS底层源码分析及其实现类
database
Self use tool unity video player that monkeys can use
Research and arrangement of electronic map coordinate system
"9 No" principle and "5 measurement dimensions" of extensible system
指针链表
Cannot edit in read-only editor if it appears in vscode
Go 数据类型篇(四)之浮点型与复数类型
多线程与高并发六:线程池源码解析
英语小记 - 表因果
Li Kou daily question - day 29 -575 Divide candy
友链须知
Unity C # e-learning (11) -- custom protocol generation tool
leetcode:单调栈结构(进阶)
English语法_形容词/副词3级 - 比较级
小程序的防抖节流怎么写?
力扣每日一题-第29天-523.在区间范围统计奇数数目
大咖说·计算讲谈社|什么是东数西算要解决的核心问题?