mongodb基本操作和在springboot中的使用
本文介绍mongodb的使用
说明
mongodb主要是用来存储json文档的,mongodb提供了操作json文档的一系列的方法
mongodb的语法结构和javascript类似,你可以直接运行JavaScript甚至js文件
由于本人也是刚涉及mongodb,本文仅仅写了一些入门级别的操作,和在springboot中如何使用mongo
本文会持续更新...
起步
下载地址 https://www.mongodb.com/download-center/v2/community
net start MongoDB 启动服务
net stop MongoDB 停止服务
sc.exe delete MongoDB 卸载服务
mongo的shell可以直接运行JavaScript
切换到程序安装目录
mongo 运行本地mongo
db 查看当前运行哪个数据库
use mydb 使用指定数据库
db.version()
mongo通用类型
null
布尔 true false
数值 3.3
字符串 "a"
日期 new Date()
正则 /[a-z]/
数组 ["a", "b", "c"]
对象 {"a": 1}
对象id ObjectId()
代码 对象值可以直接保存代码
mongoshell的操作
CRUD操作
mongo的操作风格类似JavaScript
insert操作
post = {"a":1, "b": 2}
db.obj.insert(post)
db.obj.find() 列出全部结果集
db.obj.findOne() 列出第一个
db.obj.insert([{"a": 1}, {"b": 2}, {"c": 3}]) 批量插入
update操作
post={"name": "yejiawei", "age": 18}
db.obj.update({"a":1}, post) 直接将包含{"a":1}的数据替换成新数据
db.foo.update({"c": 3}, {"$inc": {"c": 1}}) 使{"c": 3}记录的c属性自增1
db.foo.update({"c": 4}, {"$set": {"i": {"ii": 11}}}) 在{"c": 4}记录中添加{"i": {"ii": 11}}属性
db.foo.update({"c": 4}, {"$set": {"i.ii": 111}})
db.foo.update({"c": 4}, {"$push": {"j": 3}}) 往j属性,下面push成员
db.foo.update({"c": 4}, {"$push": {"j": {"$each": [4,5,6]}}}) 往j属性,下面push多个成员
db.foo.update({"c": 4}, {"$push": {"j": {"$slice": -5, "$each": [7,8,9]}}}) 往j属性,下面push多个成员,数组只保留最后5个元素
db.foo.update({"c": 4}, {"$push": {"j": {"$slice": -5, "$each": [13,14,15], "$sort": -1}}}) 往j属性,下面push多个成员,数组只保留最后5个元素,降序排序
db.obj.update({"a": 1}, {"$inc": {"a": 1}}, true) 第三个参数表示,如果记录没有则创建一个
其他的修饰器:
$addToSet 避免值重复插入
{"$pop": {"key": 1}} 从数组末尾删除一个元素
{"$pop": {"key": -1}} 从数组开头删除一个元素
update({}, {"$pull", {"arr": "somevalue"}}) 指定元素删除
delete操作
db.obj.remove({"c": 3}) 删除包含{"c": 3}的数据
find 操作
db.obj.find({}, {"a": 1}) 查找第一个包含a的记录
db.obj.find({"a": {"$gte": 0}}) 查找a值大于等于0的记录
其他修饰符
$lt 小于
$lte 小于等于
$gt 大于
$in 包含 {"$in", [1,2,3]}
$nin
$or 或者 db.obj.find({"$or": [{"a": 1}, {"a":2}]})
$mod 取模 {"$mod": [2, 1]}
$not 非
$and 与
$all 共
$size 长度
$slice 截取
限制结果
db.obj.find().limit(2) 限制返回结果只能2个
db.obj.find().skip(2) 忽略前2个
db.obj.find().sort({a: 1}) 升序排
shell命令操作
链接数据库
mongo some-host:30000/mydb 运行远程mongo
mongo --nodb 启动mongo不连接数据库
手动链接
conn = new Mongo("some-host:30000")
db = conn.getDB("mydb")
查看帮助文档
db.help()
db.obj.help()
只要你不知道的东西,调用help就行了
执行JavaScript文件
mongo C:\Users\26401\Desktop\demo.js
mongorc配置文件
.mongorc.js文件在用户主目录 C:\Users\26401 下,可以在里面添加js,在mongo开启时自动执行
prompt = function () {
return "Uptime:" + db.serverStatus().uptime + " Documents:" + db.stats().objects + " > ";
}
索引操作
文本索引
db.obj.createIndex({name: "text", description: "text"}) 创建索引
db.obj.find( { $text: { $search: "小李" } } ) 利用索引查找
db.obj.find(
{ $text: { $search: "小李" } },
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } ) 相关性排序
单字段索引和聚合索引
单字段索引
db.obj.createIndex( { age: -1 } ) 降序索引
db.obj.createIndex( { age: -1 }, { unique: true } ) 唯一索引
db.obj.find({"age": {$gt: 18}}) 这种使用方式,降序索引生效
聚合索引
原理和单个索引一样
db.products.createIndex( { "item": 1, "stock": 1 } )
mongo在springboot中的使用
目录结构
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
properties配置
# ===============================
# MONGODB
# ===============================
spring.data.mongodb.host=127.0.0.1
spring.data.mongodb.port=27017
spring.data.mongodb.database=test
User
package com.springlearn.learn.model;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
@Document(collection = "user") // mongo数据库中的json对象名
public class User {
@Id // 自动映射_id属性,每一个model都必须要一个这个
private String id;
@Version // 类似更新标识的作用,防止脏查
private Long version;
@Field(value = "name")
private String name;
@Field(value = "age")
private Integer age;
@Field(value = "sex")
private String sex;
public User(String name, Integer age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setname(String name) {
this.name = name;
}
public String getname() {
return name;
}
public void setage(Integer age) {
this.age = age;
}
public Integer getage() {
return age;
}
public void setsex(String sex) {
this.sex = sex;
}
public String getsex() {
return sex;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
}
WebConfig
package com.springlearn.learn.config;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET", "POST", "PUT", "DELETE").allowedOrigins("*")
.allowedHeaders("*");
}
@Bean
public MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory, MongoMappingContext context) {
// 自定义mongoConverter
MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory), context);
converter.setTypeMapper(new DefaultMongoTypeMapper(null));
MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, converter);
return mongoTemplate;
}
}
TestController
package com.springlearn.learn.controller;
import javax.servlet.http.HttpServletRequest;
import com.springlearn.learn.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.mapreduce.GroupBy;
import org.springframework.data.mongodb.core.mapreduce.GroupByResults;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.TextCriteria;
import org.springframework.data.mongodb.core.query.TextQuery;
import org.springframework.data.mongodb.core.query.Update;
import static org.springframework.data.mongodb.core.query.Query.query;
import static org.springframework.data.mongodb.core.query.Criteria.where;
import static org.springframework.data.mongodb.core.query.Update.update;
import java.util.List;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController{
@Autowired
MongoTemplate mongoTemplate;
@ResponseBody
@RequestMapping(value = "/test1/{id}", method = RequestMethod.GET, produces = "application/json")
public Object Test1(HttpServletRequest request, @PathVariable int id){
MongoOperations mongoOps = mongoTemplate;
// 插入数据
// User u = new User("小红", 10, "女");
// mongoOps.insert(u);
// 获取数据
// u = mongoOps.findById(u.getId(), User.class);
// 更新数据
// mongoOps.updateFirst(query(where("name").is("小红")), update("age", 18), User.class);
// User u = mongoOps.findOne(query(where("name").is("小红")), User.class);
// return u;
// mongoOps.updateFirst(query(where("name").is("小王")), new Update().inc("age", 10), User.class);
// User u = mongoOps.findOne(query(where("name").is("小王")), User.class);
// return u;
// 删除数据
// mongoOps.remove(query(where("name").is("小红")), User.class);
// return "删除成功";
// 全文索引
// Query query = new TextQuery(new TextCriteria().matchingAny("小张", "小李")).sortByScore();
// List<User> users = mongoOps.find(query, User.class);
// return users;
// 规范使用
// Query query = new Query();
// query.with(new Sort(Sort.Direction.DESC, "age"));
// query.limit(1);
// User maxUser = mongoTemplate.findOne(query, User.class);
// if (maxUser == null) {
// return "没有数据";
// }
// return maxUser;
}
}
其他的一些增删改操作例子
// { $push : { "category" : { "$each" : [ "spring" , "data" ] } } }
new Update().push("category").each("spring", "data")
// { $push : { "key" : { "$position" : 0 , "$each" : [ "Arya" , "Arry" , "Weasel" ] } } }
new Update().push("key").atPosition(Position.FIRST).each(Arrays.asList("Arya", "Arry", "Weasel"));
// { $push : { "key" : { "$slice" : 5 , "$each" : [ "Arya" , "Arry" , "Weasel" ] } } }
new Update().push("key").slice(5).each(Arrays.asList("Arya", "Arry", "Weasel"));
// { $addToSet : { "values" : { "$each" : [ "spring" , "data" , "mongodb" ] } } }
new Update().addToSet("values").each("spring", "data", "mongodb");
// 不存在则创建document
template.upsert(query(where("ssn").is(1111).and("firstName").is("Joe").and("Fraizer").is("Update")), update("address", addr), Person.class);
// findAndModify的使用
Query query = new Query(Criteria.where("firstName").is("Harry"));
Update update = new Update().inc("age", 1);
Person p = mongoTemplate.findAndModify(query, update, Person.class)
// 使用原始shell命令
BasicQuery query = new BasicQuery("{ age : { $lt : 50 }, accounts.balance : { $gt : 1000.00 }}");
List<Person> result = mongoTemplate.find(query, Person.class);
结尾
由于本人涉及mongodb没多久,如果你想知道,但是本文没有的,请告诉我,我会第一时间总结出来并发布填充到本文
请下方留言
mongodb基本操作和在springboot中的使用的更多相关文章
- redis基本操作和在springboot中的使用
本文介绍redis的使用 redis启动步骤 说明 redis自增自减相关操作 redis string set操作 get操作 其他操作 redis hash set操作 get操作 其他操作 re ...
- SpringBoot中Redis的set、map、list、value、实体类等基本操作介绍
今天给大家介绍一下SpringBoot中Redis的set.map.list.value等基本操作的具体使用方法 上一节中给大家介绍了如何在SpringBoot中搭建Redis缓存数据库,这一节就针对 ...
- SpringBoot学习笔记(10)-----SpringBoot中使用Redis/Mongodb和缓存Ehcache缓存和redis缓存
1. 使用Redis 在使用redis之前,首先要保证安装或有redis的服务器,接下就是引入redis依赖. pom.xml文件如下 <dependency> <groupId&g ...
- SpringBoot中MongoDB注解概念及使用
spring-data-mongodb主要有以下注解 @Id 主键,不可重复,自带索引,可以在定义的列名上标注,需要自己生成并维护不重复的约束.如果自己不设置@Id主键,mongo会自动生成一个唯一主 ...
- MongoDB 基本操作和聚合操作
一 . MongoDB 基本操作 基本操作可以简单分为查询.插入.更新.删除. 1 文档查询 作用 MySQL SQL MongoDB 所有记录 SELECT * FROM users; db ...
- SpringBoot中如何灵活的实现接口数据的加解密功能?
数据是企业的第四张名片,企业级开发中少不了数据的加密传输,所以本文介绍下SpringBoot中接口数据加密.解密的方式. 本文目录 一.加密方案介绍二.实现原理三.实战四.测试五.踩到的坑 一.加密方 ...
- 【MongoDB详细使用教程】二、MongoDB基本操作
目录 数据类型 数据库操作 集合操作 数据操作 增 查 改 修改整行 修改指定字段的值 删 数据类型 MongoDB常见类型 说明 Object ID 文档ID String 字符串,最常用,必须是有 ...
- SpringBoot中如何优雅的读取yml配置文件?
YAML是一种简洁的非标记语言,以数据为中心,使用空白.缩进.分行组织数据,从而使得表示更加简洁易读.本文介绍下YAML的语法和SpringBoot读取该类型配置文件的过程. 本文目录 一.YAML基 ...
- SpringBoot中yaml配置对象
转载请在页首注明作者与出处 一:前言 YAML可以代替传统的xx.properties文件,但是它支持声明map,数组,list,字符串,boolean值,数值,NULL,日期,基本满足开发过程中的所 ...
随机推荐
- http Code含义
5xx - 服务器错误 服务器由于遇到错误而不能完成该请求.
- 【poj2553】The Bottom of a Graph(强连通分量缩点)
题目链接:http://poj.org/problem?id=2553 [题意] 给n个点m条边构成一幅图,求出所有的sink点并按顺序输出.sink点是指该点能到达的点反过来又能回到该点. [思路] ...
- Linux各文件及目录说明2018-03-01更新
本人wechat:YWNlODAyMzU5MTEzMTQ=. *** /etc /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/clo ...
- 基于openfire+smack即时通讯instant message开发
前言 Java领域的即时通信的解决方案可以考虑openfire+spark+smack.当然也有其他的选择. Openfire 是基于Jabber协议(XMPP)实现的即时通信服务器端版本,目前建议使 ...
- 星火计划ROS机器人Spark
星火计划ROS机器人Spark 1 http://wiki.ros.org/Robots/Spark 2 https://github.com/NXROBO/spark ---- Spark Spar ...
- 9.proc目录下的文件和目录详解
1./proc目录下的文件和目录详解 /proc:虚拟目录.是内存的映射,内核和进程的虚拟文件系统目录,每个进程会生成1个pid,而每个进程都有1个目录. /proc/Version:内核版本 /pr ...
- windows获取屏幕显示比例 读取注册表法
static int GetDesktopScale() { ; HINSTANCE hUser32 = LoadLibrary(L"user32.dll"); if (hUser ...
- Helix Server 支持的文件格式
比如,对于WMV格式的文件,访问路径可以是:mms://192.168.1.1/mov/music.wmv 对于rm格式的文件rtsp://192.168.1.1/mov/123.rm 但,比如对于格 ...
- 关于this指向问题的总结【转自秘密花园】
this 的工作原理 JavaScript 有一套完全不同于其它语言的对 this 的处理机制. 在五种不同的情况下 ,this 指向的各不相同. 第一种:全局范围内 this; 当在全部范围内使用 ...
- Intent详解以及实例
Android中统一用Intent来封装程序的“调用意图“.不管程序想启动一个Activity,一个Servicer,还是一个BroadcastReceiver.使用Intent提供了一个统一的编程模 ...