MongoDB
MongoDB基础知识
基于分布式文件存储的数据库由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库(nosql)之间的产品,是非关系数 据库当中功能最丰富,最像关系数据库的。
MongoDB解决Mysql的“三高”问题
- 对数据库高并发写入需求
- 对海量数据高效率存储访问需求
- 对数据库高扩展和高可用的需求
MongoDB的缺点
不支持事务;不能进行对表联查
MongoDB名词概念
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接;MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
MongoDB基础操作
//查看磁盘上的所有数据库名
show dbs;//创建/使用数据库
use myschool;//查看当前所使用库的对象
db;//删除库
db.dropDatabase();//在当前库中创建集合
db.createCollection('student');
db.createCollection("teacher"); //单双引号都可以
db.createCollection("schoolmaster");//查看当前库中的集合
show collections; //方式1
show tables; //方式2//删除集合
db.schoolmaster.drop();//在集合中插入数据;被插入的数据被称为文档
db.student.insert({stuname: '张三', age: 16}
);db.student.insert({stuname: '李四', age: 18}
);db.student.insert({stuname: '王五', age: 16}
);db.student.insert({stuname: '赵六', age: 16}
);db.student.insert({stuname: '赵六', age: 20}
);db.student.insert({stuname: '赵小六', age: 20}
);db.student.insert({stuname: '六小子哈', age: 20}
);db.student.insert({stuname: '六小灵通', age: 20}
);db.student.insert({stuname: '小六子', age: 20}
);db.student.insert({shuai: true,money: true,gf: [{ stuname: '小红' }, { stuname: '小黑' }] //数组用[]写}
)//删除数据
//全部删除集合中的数据
db.student.remove({});//带条件的删除等同于:delect from student where stuname='张三';
db.student.remove({ stuname: '张三' });//注意:符合条件的全部删掉
db.student.remove({ age: 16 });//删除一个主键编号较小的一个
db.student.remove({ age: 16 }, { justOne: true }); //括号里有两个json:第一个是条件;第二个是属性db.student.remove({ age: '16' });//修改数据
//如果有多个值符合条件,只改_id最小的那个
db.student.update({ stuname: '赵六' }, //条件{ $set: { age: 71 } }
);//把所有符合条件都进行修改
db.student.update({ stuname: '赵六' }, //条件{ $set: { age: 20 } }, //更新的内容{ multi: true } //默认false,默认只修改一条;true:更改多条
);//将不存在的数据/没有匹配到的数据作为新添的值添加到集合中去
db.student.update({ stuname: '小张' },{ $set: { age: 19 } },{ upsert: true } //默认为false
);//数值改变
//在原有值基础上进行加x的效果
db.student.update({ stuname: '小张' },{ $inc: { age: 100 } }
);//在原有值基础上进行减x的效果
db.student.update({ stuname: '小张' },{ $inc: { age: -100 } }
);//查询
//全查:查看集合中的数据
db.student.find();//根据条件查询
db.student.find({ stuname: '赵六' });//age小于20的人
db.student.find({ age: { $lt: 20 } });//16<=age<=19
db.student.find({age: { $gte: 16, $lte: 19 } //gte:大于等于}
)//age>=20或者age<=16
db.student.find({$or: [{ age: { $lte: 16 } }, //lte:小于等于{ age: { $gte: 20 } }]}
)//模糊查询
//含有"六"
db.student.find({ stuname: /六/ });//"六"开头的
db.student.find({ stuname: /^六/ });//"六"结尾的
db.student.find({ stuname: /六$/ });//分页
//显示前两行的数据limit(步长)
db.student.find().limit(2)//skip((页码-1)*步长)
db.student.find().limit(2).skip((2-1)*2)//统计
db.student.find().count();db.student.find({ stuname: '赵六' }).count();//排序sort(排序规则)
//默认按照主键排序(_id:十六进制的一个数)
db.student.find();//sort({KEY:1}):升序
db.student.find().sort({ age: 1 });//sort({KEY:-1}):降序
db.student.find().sort({ age: -1 });//索引
//查看索引
db.student.getIndexes(); //创建索引【可以建同字段不同方向的索引】
db.student.createIndex({age:1}) //age升序db.student.createIndex({age:-1}) //age降序//删除索引
db.student.dropIndex({age:1})
Java操作MongoDB
Java链接MongoDB
//Java链接MongoDB//1.导入MongoDB驱动包 mongo-java-driver-3.4.2.jar//2.获取链接对象MongoClient mc = new MongoClient("localhost",27017);System.out.println(mc);//3.关闭链接mc.close();
Java对MongoDB操作
查看链接的MongoDB中的所有库
MongoClient mc = new MongoClient("localhost", 27017);//查看所有库MongoIterable<String> dbsList = mc.listDatabaseNames();for (String name : dbsList) {System.out.println(name);}//拿到数据库对象MongoDatabase db = mc.getDatabase("myschool");System.out.println(db);mc.close();
使用库查看库中的集合
MongoClient mc = new MongoClient("localhost", 27017);MongoDatabase db = mc.getDatabase("myschool");//查看库中的集合MongoIterable<String> colList = db.listCollectionNames();for (String coll : colList) {System.out.println(coll);}//拿到库中的集合对象MongoCollection<Document> coll = db.getCollection("Student");System.out.println(coll);mc.close();
Java对MongoDB增删改查
添加数据
MongoClient mc = new MongoClient("localhost",27017);MongoDatabase db = mc.getDatabase("myschool");MongoCollection<Document> coll = db.getCollection("teacher");//添加一条数据Document doc = new Document();doc.append("tname","小贺");doc.append("tsex","女");doc.append("tbir",new Date());doc.append("tage",18);coll.insertOne(doc);//添加多条数据Document doc1 = new Document();doc1.append("tname", "老杨");doc1.append("tsex", "女");doc1.append("tbir", "1996-2-2");doc1.append("tage", 28);Document doc2 = new Document();doc2.append("tname", "老王");doc2.append("tsex", "男");doc2.append("tbir", "1991-3-3");doc2.append("tage", 32);Document doc3 = new Document();doc3.append("tname", "小彭");doc3.append("tsex", "男");doc3.append("tbir", "2002-4-4");doc3.append("tage", 22);List<Document> doclist = new ArrayList<Document>();doclist.add(doc1);doclist.add(doc2);doclist.add(doc3);coll.insertMany(doclist);System.out.println("添加成功");mc.close();
删除数据
MongoClient mc = new MongoClient("localhost",27017);MongoDatabase db = mc.getDatabase("myschool");MongoCollection<Document> coll = db.getCollection("teacher");Document b1 = new Document();b1.append("tname","小贺");// Bson b1 = Filters.lt("tage",20); //年龄小于20//多个条件
// Bson b1 = Filters.and(
// Filters.gt("tage",20),
// Filters.lt("tage",30));//删除编号小的一条数据DeleteResult delOne = coll.deleteOne(b1);long delCount1 = delOne.getDeletedCount(); //删除了几条数据System.out.println(delCount1);//删除所有符合条件的数据DeleteResult delMany = coll.deleteMany(b1);long delCount2 = delMany.getDeletedCount();System.out.println(delCount2);mc.close();
修改数据
MongoClient mc = new MongoClient("localhost", 27017);MongoDatabase db = mc.getDatabase("myschool");MongoCollection<Document> coll = db.getCollection("teacher");//修改一条
// Bson b1 = Filters.eq("tname","小贺"); //要修改的条件
//
// Document doc = new Document();
// doc.append("$set",new Document("tage",24));//得到一个结果集
// UpdateResult updateOne = coll.updateOne(b1,doc); //参数:条件,要修改的内容// long matchedCount = updateOne.getMatchedCount(); //有没有找到匹配的值
// long modifiedCount = updateOne.getModifiedCount(); //有没有修改的值// System.out.println(matchedCount);
// System.out.println(modifiedCount);//修改多条Bson b1 = Filters.or(Filters.eq("tname", "老王"),Filters.eq("tname", "老彭"));Document doc = new Document();doc.append("$inc", new Document("tage", 100));UpdateResult updateMany = coll.updateMany(b1, doc);long matchedCount = updateMany.getMatchedCount();long modifiedCount = updateMany.getModifiedCount();System.out.println(matchedCount);System.out.println(modifiedCount);mc.close();
查询数据
MongoClient mc = new MongoClient("localhost", 27017);MongoDatabase db = mc.getDatabase("myschool");MongoCollection<Document> coll = db.getCollection("teacher");//查找条件
// Bson b1 = Filters.eq("tname","老杨");//模糊查询————正则表达式Bson b1 = Filters.regex("tname","^老"); //^老:老开头的;老$:老结尾的//查看所有数据
// FindIterable<Document> find = coll.find();//查看符合条件的所有数据
// FindIterable<Document> find = coll.find(b1);//分页查看skip((页码-1)*步长).limit(步长)
// FindIterable<Document> find = coll.find().skip((1-1)*2).limit(2);//排序Document document = new Document();document.append("tage",-1); //降序FindIterable<Document> find = coll.find().sort(document);for (Document doc : find) {System.out.println(doc);}mc.close();
Filters
该过滤器类为所有的MongoDB的查询操作静态工厂方法。每个方法返回BSON类型,又可以传递给期望一个查询过滤器的任何方法的一个实例。
- eq:匹配等于指定值的值
- gt:匹配大于指定值的值
- gte:匹配大于或等于指定值的值
- lt:匹配小于规定值的值
- lte:匹配是小于或等于规定值的值
- ne:匹配不等于指定值的所有值
- in:匹配任何在数组中指定的值
- nin:没有匹配数组中的规定值