mongodb常用语句以及SpringBoot中使用mongodb
普通查询
某个字段匹配数组内的元素数量的,假如region只有一个元素的
db.getCollection('map').find({region:{$size:1}})
假如region只有0个元素的
db.getCollection('map').find({region:{$size:0}})
db.getCollection('map').find({region:{$size:1}}).count()
db.getCollection('map').find({"area":{$gt:[]}}).count()
db.getCollection('map').find({"area":{$eq:[]}}).count()字段为[]
db.getCollection('map').find({"address_city":{$eq:[]}})
字段不存在
db.getCollection('map').find({"local":{$exists:false}});这个不能按>和<查询
db.getCollection('map').find({"type":"3"})
db.map.find({"type":"3"})
找出非空
db.getCollection('表').find({"字段":{$exists:true}});
查_id需要注意
db.map_area.find({"_id":ObjectId("5811c104dd908725398b5XXX")})
mongodb原生正则查询
任意匹配
db.getCollection('表').find({"description":/玉兰小区/});
前缀
db.getCollection('表').find({"description":/^玉兰/});
加i兼容大小写
db.getCollection('表').find({"station_area":/EC/i});
spring MongoDB
//等效criteria.andOperator(criteria.where("name").regex(".*" + v + ".*"));criteria.andOperator(criteria.where("name").regex(".*\\" + v + "\\.*"));criteria.andOperator(criteria.where("name").regex(".*?" + v + ".*"));//前缀查询criteria.andOperator(criteria.where("name").regex(".*^" + v + ".*"));
条件查询
//完全匹配
Pattern pattern = Pattern.compile("^商品$", Pattern.CASE_INSENSITIVE);
//右匹配
Pattern pattern = Pattern.compile("^.*商品$", Pattern.CASE_INSENSITIVE);
//左匹配
Pattern pattern = Pattern.compile("^商品.*$", Pattern.CASE_INSENSITIVE);
//模糊匹配
Pattern pattern = Pattern.compile("^.*商品.*$", Pattern.CASE_INSENSITIVE);
Query query = Query.query(Criteria.where(fieldName).regex(pattern));
List<UserInfo> users = mongoTemplate.find(query, UserInfo.class, classname);
返回指定字段
只返回address,不要id。注意前面的{}不可少
db.getCollection('user').find({},{address:1,_id:0})
数字查询mongodb原生语句
db.getCollection('表').find({"number": {$regex: '76', $options:'i'}});
Java代码同时多条件or查询
Pattern pattern = Pattern.compile(search, Pattern.CASE_INSENSITIVE);criteria.orOperator(criteria.where("name").regex(".*?\\" + search + ".*"),criteria.where("number").regex(pattern));
查询大于某个字段长度的列表
db.getCollection('表').find({"字段": {"$exists": true, "$regex": /^.{5,}$/}}).limit(5)
更新数据
db.t1.updateOne({"_id":ObjectId("523eb382d7f8b9ac3b18b4571")},
{"$set":{"name":"XXX1"}})
Query query = Query.query(Criteria.where("_id").is("53eb382d7f8b9ac3b18b4574"));
Update update = Update.update("_id", "53eb382d7f8b9ac3b18b4574").set("name","xxx22").set("description","xxxx22");
in查询
原生语句
in查询
db.getCollection('表').find({$or:[{number:"01"},{number:"02"}]})
db.getCollection('表').find({$or:[{number:"01"},{number:"02"},{status:1}]})
spring中MongoTemplate
Query query = new Query();
Criteria criteria = new Criteria();
if (condition.getType().equals("in")) {List<String> v = Arrays.asList(condition.split(","));criteria.andOperator(criteria.where("name").in(v));
}
query.addCriteria(criteria);
多条件查询or
Criteria c1= Criteria.where("name").is("XXX");
Criteria c2= Criteria.where("number").is("01");Criteria cr = new Criteria();
Query query = new Query();
query.addCriteria(cr.orOperator(c1,c2));
and
query.addCriteria(cr.andOperator(c1,c2));
多条件查询也可以这样写:
Criteria criteria = new Criteria().andOperator( Criteria.where("id").is(28), Criteria.where("name").is("123")
);
动态拼凑Criteria
Query query = new Query();
Criteria cr = new Criteria();List<Criteria> criteriaList=new ArrayList<>();
//这里可以写for循环
Criteria c1= Criteria.where("name").is("XXX");
criteriaList.add(c1);
Criteria c2= Criteria.where("number").is("01");
criteriaList.add(c2);if(criteriaList.size()>0) {Criteria[] criteriaArray = criteriaList.toArray(new Criteria[criteriaList.size()]);cr.andOperator(criteriaArray);
}
query.addCriteria(cr);if (select != null && select.size() > 0) {for (String tmp : select) {query.fields().include(tmp);}
}
List<User> list = mongoOperations.find(query, clazz);
这个写的还可以,比较全,可以延伸参考下:https://blog.csdn.net/weixin_43935907/article/details/86568387
分页
先看这个:https://www.cnblogs.com/woshimrf/p/mongodb-pagenation-performance.html
//当前第0页,每页2条
query.skip(page*row);
query.limit(row);
分页要注意 skip要*row
public int getPageSize() {return pageSize;}public void setPageSize(int pageSize) {this.pageSize = pageSize;}public int getSkip() {skip=(pageNo-1)*pageSize;return skip;}public void setSkip(int skip) {this.skip = skip;}
参考https://blog.csdn.net/congcong68/article/details/47624221
分页参考:https://blog.csdn.net/u013042707/article/details/82668613?utm_source=blogxgwz1
Criteria c1=null;Criteria c2=null;Criteria c3=null;ArrayList<Criteria> list=new ArrayList<Criteria>();if (vo.getCatalog1()!=null){c1 = Criteria.where(MyBean.FILD_CATALOG1).is(vo.getCatalog1());list.add(c1);}if (vo.getCatalog()!=null){c2=Criteria.where(MyBean.FILD_CATALOG).is(vo.getCatalog());list.add(c2);}if (vo.getTitle()!=null){//模糊查询c3=Criteria.where(MyBean.FILD_TITLE).regex(".*?\\" +vo.getTitle()+ ".*");list.add(c3);}Criteria[] arr=new Criteria[list.size()];list.toArray(arr);Criteria criteria=new Criteria().andOperator(arr);Query query=new Query(criteria);query.skip((vo.getPage()-1)*vo.getPageSize());query.limit(vo.getPageSize());List<MyBean> list= mongoTemplate.find(query, MyBean.class);return list;
分页排序
//分页和排序if (simplePageRequest.getPage() != null && simplePageRequest.getRows() != null) {query.skip(simplePageRequest.getPage() - 1);query.limit(simplePageRequest.getRows());
}if (simplePageRequest.getSort() != null && simplePageRequest.getOrder() != null) {Sort.Direction SortDirection;if (simplePageRequest.getSort().toLowerCase().equals("asc")) {SortDirection = Sort.Direction.ASC;} else {SortDirection = Sort.Direction.DESC;}Sort sort = new Sort(SortDirection, simplePageRequest.getOrder());query.with(sort);
}
说明:多个排序参数
Sort sort = new Sort(Sort.Direction.ASC, “ID”).and(new Sort(Sort.Direction.ASC, “TIME”));
查看索引:
db.getCollection('表').getIndexes()
查询数组个数限制
https://docs.mongodb.com/manual/reference/operator/query/size/
img是个数组,需要数组个数>2个
写法1:这是一种比较骚的写法,一般看不明白:
MongoDB下根据数组大小查询
criteria.and("img.2").exists(true);
写法2:取反
criteria.norOperator( Criteria.where("img").size(0));
写法3:枚举 有局限多了不好搞 这实际上是查单个等于的
criteria.orOperator(Criteria.where("img").size(3),Criteria.where("img").size(4),Criteria.where("img").size(5),Criteria.where("img").size(6));
不为空不为null
criteria.and("img").ne("").ne(null);
扩展参考:
mongodb查询非空数组的几种方法
Spring Data Mongodb的Criteria类(all、and、andOperator、elemMatch)
查询数组:
包含,完全匹配
https://blog.csdn.net/leshami/article/details/55049891
相关文章:

2002高教社杯---A车灯线光源的优化设计
A题 车灯线光源的优化设计 安装在汽车头部的车灯的形状为一旋转抛物面,车灯的对称轴水平地指向正前方, 其开口半径36毫米,深度21.6毫米。经过车灯的焦点,在与对称轴相垂直的水平方向,对称地放置一定长度的均匀分布的线光源。要求…

从Date类型转为中文字符串
//主方法public static String DateToCh(Date date) {Calendar cal Calendar.getInstance();cal.setTime(date);int year cal.get(Calendar.YEAR);int month cal.get(Calendar.MONTH) 1;int day cal.get(Calendar.DAY_OF_MONTH);return getYear(year) getTenString(month…

第十四课 如何在DAPP应用实现自带钱包转账功能?
1,为什么DAPP生态需要自带钱包功能? 区块链是一个伟大的发明,它改变了生产关系。很多生态,有了区块链技术,可以由全公司员工的"全员合伙人"变成了全平台的”全体合伙人”了,是真正的共享经济模式…

为什么jdk源码推荐ThreadLocal使用static
ThreadLocal是线程私有变量,本身是解决多线程环境线程安全,可以说单线程实际上没必要使用。 既然多线程环境本身不使用static,那么又怎么会线程不安全。所以这个问题本身并不是问题,只是有人没有理解ThreadLocal的真正使用场景&a…

C与C++之间相互调用
1、导出C函数以用于C或C的项目 如果使用C语言编写的DLL,希望从中导出函数给C或C的模块访问,则应使用 __cplusplus 预处理器宏确定正在编译的语言。如果是从C语言模块使用,则用C链接声明这些函数。如果使用此技术并为DLL提供头文件,…
【MATLAB】三维图形的绘制mesh
步骤如下: (1)确定自变量x和y的取值范围和取值间隔 x x1 :dx :x2 , y y1 : dy : y2 (2)构成xoy平面上的自变量采样“格点”矩阵 ①利用格点矩阵的原理生成矩阵。 xx1:dx:x2; yy1:dy:y2; Xones(size(y))*x; Yy*o…

ORA-01919: role 'PLUSTRACE' does not exist
环境:Oracle 10g,11g.现象:在一次迁移测试中,发现有这样的角色赋权会报错不存在: SYSorcl> grant PLUSTRACE to jingyu; grant PLUSTRACE to jingyu* ERROR at line 1: ORA-01919: role PLUSTRACE does not exist 查询发现这个…

Java反射以及应用
需求:需要通过反射动态获取类的字段类型,然后做特殊处理 Java反射getDeclaredField和getField的区别 getDeclaredFiled 只能获取类本身的属性成员(包括私有、共有、保护) getField 仅能获取类(及其父类可以自己测试) public属性…

【MATLAB】雅可比矩阵jacobi matrix
参考页面: https://baike.baidu.com/item/%E9%9B%85%E5%8F%AF%E6%AF%94%E7%9F%A9%E9%98%B5/10753754?fraladdin#1 在向量微积分中,雅可比矩阵是一阶偏导数以一定方式排列成的矩阵,其行列式称为雅可比行列式。 由球坐标系到直角坐标系的转…

Laravel:使用Migrations
1、首先利用artisan创建一个可迁移的数据表模板,该命令运行后会在database/migrations目录下生成一个文件 php artisan make:migration create_fees_count_table --createfees_count 2、生成的文件包含up和down两个方法,其中up中是包含了添加表ÿ…

基于libevent和unix domain socket的本地server
https://www.pacificsimplicity.ca/blog/libevent-echo-server-tutorial 根据这一篇写一个最简单的demo。然后开始写client。 client调优 client最初的代码如下: 1 #include <sys/socket.h>2 #include <sys/un.h>3 #include <stdio.h>4 #include …

软件体系架构模式之一什么是软件架构模式
什么是软件架构模式 计划启动未开发的软件项目?然后选择正确的架构模式将对项目的结果起关键作用。选择市场上最流行或最新的技术并不总是意味着会带来最好的结果。但是,选择最合适的解决方案将为行之有效的问题和反复出现的问题提供可靠的解决方案。 …

HP 服务器 iLO 远程控制软件 介绍
iLO了解:iLO 是一组芯片,内部是vxworks的嵌入操作系统,在服务器的背后有一个标准RJ45口对外连接生产用交换机或者带外管理的交换机。iLO 全名是 Integrated Lights-out,它是惠普某些型号的服务器上集成的远程管理端口,它能够允许用…
【MATLAB】数据分析之数据插值
插值:求过已知有限个数据点的近似函数。 区别于拟合: 拟合:已知有限个数据点求近似函数,不要求过已知数据点,只要求在某种意义下它在这些点上的总偏差最小。 基本常用的插值方法:拉格朗日多项式插值&…

迈斯!啊呸~数学
1.数论 快速幂 int po(int x,int y) {int ans1;while(y){if(y%21)ans1ll*ans*x%p;x1ll*x*x%p;y/2;}return ans; } 乘法逆元(保证模域p与求逆元的数互质) po(a,p-2);//a为需要求逆元的数 扩展欧几里得(exgcd) #include<cstdio&g…

软件体系架构模式之二分层体系结构
分层体系结构模式是n层模式,其中组件被组织在水平层中。这是设计大多数软件的传统方法,并且具有独立性。这意味着所有组件都是互连的,但彼此之间不依赖。 图1:分层架构 在此体系结构中有四层,其中每一层在模块和其中的…

linux下mysql的root密码忘记解决方法
1.首先确认服务器出于安全的状态,最安全的状态是到服务器的Console上面操作,并且拔掉网线,或者可以使用--skip-networking限制只能从本地连接2.修改MySQL的登录设置: # vim /etc/my.cnf在[mysqld]的段中加上…
【Python】turtle库的小应用
心血来潮,哈哈哈,画的不好,请多见谅 大家如果想要尝试turtle库,可以借鉴: https://www.cnblogs.com/nowgood/p/turtle.html 导入库,我的pycharm里可以直接使用,哈哈哈,不行就pip…

[转]MySQL修改时区的方法小结
本文转自:https://www.cnblogs.com/mracale/p/6064447.html 这篇文章主要介绍了MySQL修改时区的方法,总结分析了三种常见的MySQL时区修改技巧,包括命令行模式、配置文件方式及代码方式,需要的朋友可以参考下 方法一:通过mysql命令行模式下动态修改 1.1 查…

swift轮播图代码
import UIKit private let CycleCellID "CycleCellID" class BannerCycleView: UIView { var layout : UICollectionViewFlowLayout! var collectionView :UICollectionView! var pageContol : UIPageControl? var cycleTimer : Timer? let timeInterval : TimeI…

软件体系架构模式之三微内核体系架构
当您的软件系统或产品包含许多与外部实体的集成点时,微内核体系结构模式将非常有用。最重要的是,您将无法准确判断出将来将哪些实体集成到您的系统中。可以将微内核架构模式识别为基于插件的模式。。也称为插件架构模式,它由两个主要组件组成…
【MATLAB】交互式绘图(ginput,gtext,zoom)
1、ginput指令: [x,y]ginput(n) %(其功能是用鼠标从二维图形中获取n个点的数据坐标) x-8*pi:pi/100:8*pi; y1sin(x); y24*sin(x/4); plot(x,y1,r-,x,y2,k-); legend(sin(x),4sin(x/4)); grid on; [x,y]ginput(8); %在下方命令窗…

【斗医】【18】Web应用开发20天
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://qingkechina.blog.51cto.com/5552198/1544928 本文通过获取首页内容来讲解Web页面拖拽获取当前页数据,功能类似在google查看图…

数据库和缓存一致性的问题
经常看到有人问怎么解决数据库和缓存一致性的问题,这个问题我觉得是不要去解决。 如果你不信你先看我列的几种情况 假设 数据库一开始和缓存都是1元。 用户更新数据库的同时双写缓存。 1.双写不删 写库充值10元>>>返回成功 ----- 时间间隔 <<<…
【MATLAB】数据分析之求函数的极限(limit)
在MATLAB中采用limit函数求某个具体函数的极限,其调用格式如下: limit(expr,x,a):当xa时,对函数expr求极限,返回值为函数极限。limit(expr):默认当x0时,对函数expr求极限,返回值为函…

Spring Boot集成Swagger导入YApi@无界编程
接口APi开发现状 现在开发接口都要在类似YApi上写文档,这样方便不同的团队之间协作,同步更新接口,提高效率。 但是如果接口很多,你一个个手工在YApi去录入无疑效率很低。 如果是使用Spring Boot集成Swagger可以直接导入YApi非常…
【MATLAB】数据分析之函数数值积分
一、数值积分问题的数学表达 称为积分节点,称为求积系数。右端公式称为左端定积分的某个数值积分。MATLAB支持三重以下的积分运算。分别为: 在计算积分时,要求积分区间是确定的。 二、一元函数的数值积分 1、quad函数:采用遍历的…

c++对象切片
什么事对象切片:c在将一个派生类转换为基类的过程中,派生类的一部分将被基类接收不到,只能留下基类大小的对象。传值调用的切片:#include<iostream> using namespace std; class Base { public: virtual void func1() { cou…

javascript数据结构与算法-队列
定义 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为…

Oracle学习笔记十三 触发器
2019独角兽企业重金招聘Python工程师标准>>> 简介 触发器是当特定事件出现时自动执行的存储过程,特定事件可以是执行更新的DML语句和DDL语句,触发器不能被显式调用。 触发器的功能: 1.自动生成数据 2.自定义复杂的安全权限 3.提供…