MongoDB 是一个基于分布式文件存储的数据库。
由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
mongodb是目前在IT行业非常流行的一种非关系型数据库(NoSql)
大纲如下:
- Mongodb介绍/安装
- 命令行增删改查操作
- 客户端工具mongochef使用
- JAVA驱动操作Mongodb
- Spring Data Mongodb框架搭建
- Spring Data Mongodb框架之MongoTemplate
- Spring Data Mongodb框架之代码连接数据库
- Spring Data Mongodb框架之去掉_class字段
- Spring Data Mongodb框架之Repository
- 自增ID通用设置,开发者不用关心
- 批量更新封装
- gridfs文件上传下载操作
- DBRef的使用
- mapreduce实战
- aggregation实战
- 项目实战:用mongodb设计以及编码实现一个权限系统
mongodb
数据结构不固定的
bson(json)
{id:1,name:"张三"}
{id:2,name:"李四",age:22,address:["上海1号","上海2号"]}
DB
集合(collection) ---> table
文档(document) ---> row
key ---> col
命令行增删改查:
show dbs 展示所有数据库
use test 进入某个数据库
db.createCollection("test"); 创建集合
show collections; 查看集合
db.test2.save({"name":"json"}) 插入数据
db.test2.find() 查询数据
db.test2.findOne() 查询第一条
db.test2.find().skip(1).limit(1)分页用法
db.test.find({}).sort({age:1}) 1升序 -1降序
db.test.find({},{age:1}) 只显示需要的字段 1为显示 -1为不显示
db.test.update({name:"kk"},{"$set":{age:11}},true,true) 第三个参数为true表示要修改的数据不存在则插入一条新的,false不修改也不创建。第四个参数为true表示修改所有满足条件的数据,false修改第一条
db.test.drop() 删除集合
db.test.remove({}) 删除集合中所有数据
JAVA驱动操作Mongodb:
package com.tangzhe.mongodb; import com.mongodb.MongoClient; import com.mongodb.MongoClientOptions; import com.mongodb.ServerAddress; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Filters; import com.mongodb.client.model.UpdateOptions; import org.bson.Document; import org.junit.Before; import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Created by 唐哲 * 2018-03-10 18:00 * 测试 Java 操作 MongoDB */ public class MongodbTest { private MongoCollection<Document> collection = null; //@Before public void before() { //配置mongo客户端 MongoClientOptions options = MongoClientOptions.builder().connectTimeout(60000).build(); //创建mongo客户端 MongoClient client = new MongoClient(new ServerAddress("localhost", 27017), options); //获取数据库 MongoDatabase db = client.getDatabase("mamabike"); //获取集合,相当于关系型数据库中的表 collection = db.getCollection("test"); } /** * 插入一条数据 */ //@Test public void insertOne() { collection.insertOne(new Document("name", "zhangsan").append("age", 18)); } /** * 批量插入 */ //@Test public void insertMany() { List<Document> documents = new ArrayList<>(2); documents.add(new Document("name", "张三").append("age", 19)); documents.add(new Document("name", "李四").append("age", 20)); collection.insertMany(documents); } /** * 修改张三的年龄为22 */ //@Test public void updateByName() { collection.updateOne(Filters.eq("name", "张三"), new Document("$set", new Document("age", 22))); } /** * 如果查询到则进行修改 * 如果查询不到则插入 */ //@Test public void updateOrInsert() { collection.updateOne(Filters.eq("name", "lisi"), new Document("$set", new Document("age", 23)), new UpdateOptions().upsert(true)); } /** * 删除一条数据 */ //@Test public void deleteOne() { collection.deleteOne(Filters.eq("name", "lisi")); } /** * 查询第一条数据 */ //@Test public void findFirst() { Document doc = collection.find().first(); System.out.println(doc); } /** * 查询所有 */ //@Test public void findAll() { FindIterable<Document> documents = collection.find(); MongoCursor<Document> iterator = documents.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } } /** * 多条件查询 */ //@Test public void findByQuery() { Document doc = collection.find( Filters.and( Filters.eq("name", "张三"), Filters.eq("age", 22) )) .first(); System.out.println(doc); } }
package com.tangzhe.mongodb; import com.mongodb.MongoClient; import com.mongodb.MongoClientOptions; import com.mongodb.ServerAddress; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import org.bson.codecs.configuration.CodecRegistries; import org.bson.codecs.configuration.CodecRegistry; import org.junit.Before; import org.junit.Test; /** * Created by 唐哲 * 2018-03-10 19:39 */ public class MongodbTest2 { //可以指定类型 private MongoCollection<User> collection = null; //@Before public void before() { //配置mongo客户端 MongoClientOptions options = MongoClientOptions.builder().connectTimeout(60000).build(); //创建mongo客户端 MongoClient client = new MongoClient(new ServerAddress("localhost", 27017), options); //获取数据库 MongoDatabase db = client.getDatabase("mamabike"); //注册类型转换器 CodecRegistry codecRegistry = CodecRegistries.fromRegistries(CodecRegistries.fromCodecs(new UserCode())); //获取集合,相当于关系型数据库中的表 collection = db.getCollection("test", User.class).withCodecRegistry(codecRegistry); } /** * 插入一个javabean到mongodb */ //@Test public void insertTest() { User user = new User(); user.setName("王五"); user.setAge(33); collection.insertOne(user); } //从mongodb读取数据,封装成javabean //@Test public void findTest() { User user = collection.find().first(); System.out.println(user); } }
package com.tangzhe.mongodb; import lombok.Data; import org.bson.types.ObjectId; /** * Created by 唐哲 * 2018-03-10 19:38 */ @Data public class User { private ObjectId _id; private String name; private Integer age; }
package com.tangzhe.mongodb; import org.bson.BsonReader; import org.bson.BsonWriter; import org.bson.codecs.Codec; import org.bson.codecs.DecoderContext; import org.bson.codecs.EncoderContext; /** * Created by 唐哲 * 2018-03-10 19:43 * 转换器 */ public class UserCode implements Codec<User> { @Override public User decode(BsonReader bsonReader, DecoderContext decoderContext) { bsonReader.readStartDocument();; User user = new User(); user.set_id(bsonReader.readObjectId("_id")); user.setName(bsonReader.readString("name")); user.setAge(bsonReader.readInt32("age")); bsonReader.readEndDocument(); return user; } @Override public void encode(BsonWriter bsonWriter, User user, EncoderContext encoderContext) { bsonWriter.writeStartDocument(); bsonWriter.writeString("name", user.getName()); bsonWriter.writeInt32("age", user.getAge()); bsonWriter.writeEndDocument(); } @Override public Class<User> getEncoderClass() { return User.class; } }