–日常收集
MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
MongoDB是一个面向文档的数据库,它并不是关系型数据库,直接存取JSON,这意味着MongoDB更加灵活,因为可以在文档中直接插入数组之类的复杂数据类型,并且文档的key和value不是固定的数据类型和大小,所以开发者在使用MongoDB时无须预定义关系型数据库中的”表”等数据库对象,设计数据库将变得非常方便,可以大大地提升开发进度。由应用程序,而非数据库来保证数据结构。
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。
db.collection.createIndex(keys, options)
例:db.col.createIndex({"title":1})唯一索引
db.col.createIndex({"title":1,"description":-1})复合索引
可以通过下面的名称查看索引是否已经成功建立:
> db.col.getIndexes()
删除索引的命令是:
db.col.dropIndex({"title":1})
如果在为已有数据的文档创建索引时,可以执行下面的命令,以使MongoDB在后台创建索引,这样的创建时就不会阻塞其他操作。但是相比而言,以阻塞方式创建索引,会使整个创建过程效率更高,但是在创建时MongoDB将无法接收其他的操作。*
db.col.ensureIndex({"username":1},{"background":true})
expireAfterSeconds: xx
设置在xx秒后自动删除文档,首先得有一个date类型的字段
然后用这个date字段创建一个索引
//文档将在(lastModifiedDate.addHours(1))被删除
db.log_events.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } )
//这条文档将在2018-01-22 15:00:00左右被删除
db.log_events.insert( {
"lastModifiedDate": new Date('Jan 22, 2018 14:00:00'),
"logEvent": 2,
"logMessage": "Success!"
} )
注意:非立即执行:扫描 Document 过期数据并删除是独立线程执行,默认 60s 扫描一次,删除也不一定是立即删除成功。
use 数据库名 进入数据库 若数据库不存在,创建数据库
db 显示当前数据库
show dbs 显示内容非空的数据库
db.createCollection(‘表名’) 创建不限长度的表
db.createCollection(‘表名’ ,{capped:true,size:1000}) 创建限制长度的表
db.表名.drop() 删除集合
show collections 显示所有表
db.表名.find() 查找表数据
db.表名.find({列名:数据1}) 按条件查询
db.表名.find({列名:数据1}).pretty() pretty() 将查带的结果格式话,更容易看清结构和内容
db.表名.findOne({列名:数据1}) 按条件查询,只返回第一条
db.表名.update({列名:数据1},{列名:数据2}) 查找到数据1 ,替换为数据2
db.表名.update({列名:数据1},{$set:{列名:数据2}}) 查找到列为数据1的,替换所有数据1为数据2
db.表名.remove({列名:数据1},{justOne:true}) 删除数据1的行,justOne为true时删除1条,为false时删除多条
比较运算符 :
小于 $lt 小于等于 l t e 大 于 lte 大于 lte大于gt 大于等于 g t e 不 等 于 gte 不等于 gte不等于ne
逻辑运算符:
$or 或 并且 可以直接逗号连接 $in 在。。。里
排序: sort()
db.表名.find().sort({字段:参数}) 参数为1 升序 参数为-1 降序
分页 :limit()
db.表名.find().limit(参数) 参数是获取的条数
db.表名.find().skip(参数) 参数是跳过的条数
db.表名.count({列名:数据1})统计数据的条数
db.表名.find(列名:数据1).distinct(‘去重字段’,{列名:数据2}) 除去重复
1、引入包
org.springframework.boot
spring-boot-starter-data-mongodb
1.5.9.RELEASE
2、配置数据源
配置数据源
spring.data.mongodb.uri= mongodb://地址
3、在实体中添加注解
在实体添加@Document注解,collection= “对应的表名”。
在属性上添加@Filed注解,值为对应的字段名
@Getter
@Setter
@Document(collection = "User")
public class User {
/*
用户id:
*/
@Field("id")
private String id;
/*
用户名
*/
@Field("UserName")
private String userName;
/*
性别
*/
@Field("sex")
private String sex;
}
4、在业务层使用MongoDb的方法:
@Service
public class UserServiceImpl implements UserService {
@Resource
private MongoTemplate mongoTemplate;
@Override
public long getCount() {
Query query = new Query();
long count = mongoTemplate.count(query,User.class);
return count;
}
}
创建个实体类,方便对应理解
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
@Document(collection = "collection_name")
public class UserPO {
@Indexed
@Field("user_id")
private Long userId;
@Field("username")
private String username;
@Field("password")
private String password;
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
增删改查
//插入一条
UserPO userPO = new UserPO();
userPO.setUserId(1L);
userPO.setUsername("username");
userPO.setPassword("password");
mongoTemplate.insert(userPO);
//插入多条
LinkedList<UserPO> pos = Lists.newLinkedList();
UserPO userPO = new UserPO();
userPO.setUserId(1L);
userPO.setUsername("username");
userPO.setPassword("password");
pos.add(userPO);//集合中可以放多个
mongoTemplate.insertAll(pos);
//删除
Query query=new Query(Criteria.where("_id").is(id));
mongoTemplate.remove(query,UserPO.class);
//更新
Query query=new Query(Criteria.where("_id").is(id));
Update update = Update.update("要更新的字段", "更新的值");
mongoTemplate.updateFirst(query, update, UserPO.class);
//查找
//分页查询
Query query = new Query();
query.skip("跳过的数据条数").limit("一页的数据条数");
return mongoTemplate.find(query, UserPO.class);
//条件查询1,多条件is("值")后面可以加and("字段2").is("值2")
Query query=new Query(Criteria.where("字段1").is("值1"));
return mongoTemplate.find(query, UserPO.class);