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
//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中的所有库
java
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();
使用库查看库中的集合
java
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增删改查
添加数据
java
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();
删除数据
java
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();
修改数据
java
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();
查询数据
java
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:没有匹配数组中的规定值