mongdb常用查询

news/2024/11/28 5:35:53/

mongdb数据库和关系型数据库完全不同, 主要在数据结构存储和查询语法方面。mongdb是把数据存在文档里面,文档里面是一种bson格式的数据(类似json格式),再通过mongdb的javascript语法取读取符合条件的文档内容用表的形式展示给我们。查询语句为 db.表名.find(query, projection); 含义如下

db是全局变量,固定不变
find 类似select关键字。 除了find,还有insert、update等等
query 类似where关键词后面的条件(可无,如有,需要用{}括起来)
projection 你要查询哪几个字段(可无,如有,需要用{}括起来)

下面写了一些比较常用的查询语法

查询操作mongdb SQL关系型SQL备注
全部数据全部字段db.t_user.find();select * from t_user;
查name=zhangsandb.t_user.find({“name”:“zhangsan”});select * from t_user where name = “zhangsan”;字段名大小写敏感,name和Name不是同一个字段了;若多个and条件,{}里面逗号间隔即可
查name!=zhangsandb.t_user.find({“name”:{$ne:“zhangsan”}})select * from t_user where name != “zhangsan”;
查name=nulldb.t_user.find({“name”:null})select * from t_user where name is null不存在name字段的记录默认null,此时满足条件也会被查询出来
只查name和age字段db.t_user.find({“name”:“zhangsan”}, {name:1,age:1});select name, age from t_user where name = “zhangsan”;没有任何where条件时,前面的{}里面空着就行;后面那个{},省略就是默认查全部字段,不省略就是自定义查哪些字段。字段名称后的数字表示该字段 1展示 或 0不展示。 也可以使用true/false代替1/0
查询 indb.t_user.find({“name”:{$in:[“zhangsan”,“lisi”]}});select * from t_user where name in (“zhangsan”,“lisi”);in表示满足任意一个,nin表示均不满足=not in,all表示均满足
查询 not indb.t_user.find({name:{$nin:[“zhangsan”,“lisi”]}});select * from t_user where name not in (“zhangsan”,“lisi”);
查询 ordb.t_user.find({“$or”:[{“name”:“zhangsan”},{“age”:18}]});select * from t_user where name = “zhangsan” or age = 18;
查询 范围db.t_user .find({“age”:{$ gte:18,$ lte:22}})select * from t_user where age >= 18 and age <= 22;$lt $ge $lte $gte 代表 <、>、<=、>=
模糊查询db.t_user .find({“name”: {“$regex”: /zhangsan/}});select * from t_user where name like ‘%zhangsan%’;都是正则表达式,类似的还有: 以zhang开头 /^zhang/ 等价 ‘zhang%’ 、 以zhang结尾 /zhang$/ 等价 ‘%zhang’ 、 /zhang/i 忽略大小写
是否存在db.t_user.find({“age”:{$exists:true}});查询存在age字段的记录。查不存在的改为false即可

下面是一些对 “查询结果” 再做处理的方法

操作mongdb SQL关系型SQL备注
数据格式化db.t_user.find().pretty();相当于json格式化
去重db.t_user.find().distinct(“name”);select distinct name from t_user;
统计行数db.t_user.find().count();select count(*) from t_user
求和db.t_user.aggregate([{$ group:{_id:null,age:{$ sum:“$age”}}}]);select sum(age) from t_user类似的,求平均值把sum改成avg。 其他还有min、max、push(把查询结果方数组里)、first(取第一个)、last
查前N条db.t_user.find().limit(10);select * from t_user limit 10 或者 select top 10 * from t_user展示前10条
不要前N条db.t_user.find().skip(10);select * from t_user where rowId > 10前10条舍弃不要
排序db.t_user.find().sort({age:-1});select * from t_user order by age desc1正序 -1倒序
分页db.t_user.find().skip(10).limit(10)select * from t_user limit 10, 20;第pageNo页时,skip=(pageNo-1)*pageSize,limit=pageSize (pageNo是当前页码 pageSize是每页条数 )
分页+排序db.t_user.find().skip(10).limit(10).sort({age:-1});select * from t_user limit 10, 20 order by age descskip(), limilt(), sort()这三个的执行顺序是先sort(),然后是skip(),最后是limit()
分组db.t_user.find({$ group:{name: ‘$name’}});select * from t_user group by name;
查子集db.t_user.find({},{“name”:{“$slice”:10}})select * from t_user limit 10slice可从结果集里(根据某个字段)得到子集;10表查前10条,-10表示查后10条,[10,20] 表示查区间

下面是一些有用的javascript语法

操作mongdb SQL备注
查某个key存在db.t_user.find({“age”:{$exists:true}});不存在改成false
过滤key不存在的记录db.t_user.find({age:{“$ in”:[null], “$ exists”:true}})age = null或age不存在的都会被查询出来,通过exists过滤不存在只留下age=null的
定义参数的查询var start = new Date(“11/03/2023”); // 定义变量并赋值 db.t_user.find({createTime:{$ lte:start}}) // 根据按时间查询或者 db.t_user.find({createTime:{$gt:ISODate(“2023-03-11T00:00:00Z”)}});
既有where条件同时有函数db.t_user.aggregate([{$ match:{createTime:{$ gte:ISODate(“2020-11-10T00:00:00Z”),$ lt:ISODate(“2020-11-11T00:00:00Z”)}}},{$ group:{_id:null,age:{$ sum:“$age”}}}])等同SELECT SUM(age) from t_user where createTime >= ‘2020-11-10 00:00:00’ and createTime < ‘2020-11-11 00:00:00’;

下面是一些拓展功能参考

# 遍历集合   注:游标10分钟内没有使用会自动销毁(immortal函数可设置超时不销毁)
var cursor=db.t_user.find();  //定义游标,使用forEach循环
cursor.forEach(function(f){print(f.name,f.age); // 循环打印姓名 年纪
});
或者 
var cursor=db.t_user.find();  //定义游标
while(cursor.hasNext()){var f = cursor.next();print(f.name,f.age); // 循环打印姓名 年纪
}# 随机查询一条 等价SELECT * FROM t_user ORDER BY RAND() limit 1
var total = db.t_user.count(); // 查询总数
var random = Math.floor(Math.random()*total); // 根据总数取个随机值random 
db.t_user.skip(random).limit(1); // 前random条舍弃,从剩下的里面取第一条# 插入数据
db.t_user.insert([
{ "_id" : 1, "userId" : "u1", "name" : "zhangsan", "age" : "15" },
{ "_id" : 2, "userId" : "u2", "name" : "lisi", "age" : "22" }
]); 
关于insert、insertOne、insertMany、save的区别 
insert和insertMany 一次可以插入多条。可以搭配{ordered:true}使用。ordered为是否按顺序写入之意,默认true。即中间某条插入失败时,true则中断不执行后续,false可以继续执行后面的
insertOne和save 一次只能插入一条,多条报错。且前者若主键冲突报错,后者则覆盖旧数据# 关联查询  类似于 select info.* from t_user_info info left join t_user u on info.user_id = u.user_id where info.name = 'zhangsan'
db.t_user_info.aggregate([{$lookup: # 表示表关联查询{from: "t_user", # 被关联的表名称localField: "user_id", # 关联字段:t_user_info.user_idforeignField: "user_id", # 关联字段: t_user.user_idas: "userInfo" # 结果集别名}},{ $match : {"name" :"zhangsan"} } # where条件进行过滤
])# 根据姓名分组查数量 select name as _id, count(*) as num from t_user group by name 
db.t_user.aggregate([ {$group: { # 分组_id: '$name',  # 根据什么字段字段进行分组,这里是根据name字段。'$name'也可以改成null表示只分一个组,目的一般用于求和求平均数等场景num: {$sum: 1} # 每个分组数量 * 1 (1不是固定值可以改成别的数字)# ageArray: {$push: '$age'} # 把每个组的age字段放在ageArray这个数组字段里面, 所以push有点类似wm_concat()函数,数组拼接和逗号拼接的格式区别而已}}
])# 综合查询 select name, age from t_user where age > 20 group by name limit 10,20 order by name desc 
db.t_user.aggregate([{$project: { // 需要查询哪些字段_id: 0, // _id字段不查name: 1 // name和age字段查age: 1}},{$match: {age: {$gt: 20} // 匹配条件 年纪大于20的}},    {$group: {            name: '$name', // 根据name分组			}},{$sort: {name: -1 // 根据name倒叙}},{$skip: 10},{$limit: 10}
])

查询用 find(普通查询) 和 aggregate(聚合查询) 都可以,但后者的效率好一点。find是用{}来接收查询条件,aggregate用数组[]来接收查询条件。如果用aggregate,根据下面表格可以快速记忆下来,配合上面的示例就可以写出符合需求的脚本语句了。

关系型数据库 关键词monggodb 关键词
where/havingmatch
group bygroup
order bysort
sum/countsum
joinlookup
concatpush
limitlimit
maxmax
minmin

http://www.ppmy.cn/news/109808.html

相关文章

数电/数字电子技术期末考前突击复习(小白稳过,看这一篇就够了)

博主&#xff1a;命运之光 专栏&#xff1a;期末考试必过and不挂科and争高分&#x1f636;‍&#x1f32b;️还有其他科目的考试突击日后会陆续更新 ✨✨✨✨✨点赞&#xff0c;关注&#xff0c;收藏不迷路✨✨✨✨✨ &#x1f984;前言&#xff1a;总结了期末数电大概率可能…

基于Html5的在线资料库的设计与实现(asp.NET,SQLServer)

在线资料库系统采用.NET开发平台进行开发&#xff0c;开发工具采用Microsoft Visual Studio 2010集成开发环境&#xff0c;后台编程语言采用C#编程语言来进行编程开发&#xff0c;数据库我们采用当下流行的SQL Server 2008数据库管理系统来存放平台中的数据信息&#xff0c;整个…

微服务-Elasticsearch基础篇【内含思维导图】

Elasticsearch官网&#xff1a;欢迎来到 Elastic — Elasticsearch 和 Kibana 的开发者 | Elastic 注意&#xff1a;Elasticsearch官网访问和加载的耗时很长&#xff01;&#xff01;&#xff01; Lucene官网&#xff1a;Apache Lucene - Welcome to Apache Lucene 目录 一、E…

数据挖掘——关联分析算法

系列文章目录 数据挖掘当中的时间序列分析——不等权平滑分析 文章目录 一、关联分析介绍 二、关联分析算法实现以及相关的语句解释 2.1、 关联分析算法的C语言代码 2.2、相关解释 总结 前言 本文主要介绍关联分析算法简介以及相关的案例举例说明与代码解释 一、关联分…

2023/5/30总结

内部类&#xff08;1&#xff09; 类的五大成员&#xff1a;属性、方法、构造方法、代码块、内部类 内部类就是在一个类里面&#xff0c;再定义一个类 比如&#xff0c;在A类的内部定义B类&#xff0c;B类就被称为内部类 例&#xff1a; 汽车的发动机、ArrayList的迭代器、人…

【测试基础01】

本期参考文献: 链接 一、安装mysql 1、安装mysql可以参考链接: 文章 2、安装mysql与python的工具 进行校验&#xff0c;查看是否安装成功 二、创建库 mycursor mydb.cursor() mycursor.execute("CREATE DATABASE ck") 执行语句创建库在mysql库里可以看到…

layui框架学习(25:弹出层模块_加载框询问框)

layui框架的弹出层模块layer中最重要的函数即layer.open&#xff0c;基于该函数&#xff0c;layer模块封装了很多常用弹出框&#xff0c;上文已介绍了消息框和提示框函数&#xff0c;本文学习加载框和询问框函数的基本用法&#xff0c;同时继续学习layer模块中基础参数的用法。…

2023年9月数学建模:网络流问题:最大流与最小费用最大流

2023年9月数学建模国赛期间提供ABCDE题思路加Matlab代码,专栏链接(赛前一个月恢复源码199,欢迎大家订阅):http://t.csdn.cn/Um9Zd 目录 介绍 最大流问题 概念与原理 Ford-Fulkerson算法与Edmonds-Karp算法 最小费用最大流问题 概念与原理 网络单纯形法与最短增广路径法 …