MongoDB是一种基于分布式文件存储的数据库,由C++语言编写,旨在为Web应用提供可扩展且高性能的数据存储解决方案。它在关系数据库与非关系数据库之间架起了一座桥梁,是功能最丰富、最像关系数据库的非关系数据库之一。
MongoDB的优点
- 文档存储:MongoDB提供面向文档的存储,操作简单易懂,适合快速开发。
- 自动分片:当负载增加时,MongoDB能够将数据分布到计算机网络中的其他节点,使得系统具有良好的扩展性。
- 多语言支持:支持多种编程语言,如Ruby、Python、Java、C++、PHP、C#等,便于开发者使用。
- 镜像功能:能够通过本地或网络创建数据镜像,增强系统的扩展能力。
MongoDB的缺点
- 无事务支持:MongoDB不原生支持多文档事务,可能会影响某些应用场景。
- 缺乏多表联查:在某些复杂查询需求中,MongoDB的性能可能不如传统关系数据库。
MongoDB的优势场景
MongoDB有效解决了传统MySQL在以下方面的短板:
- 高并发写入:可以满足对数据库高并发写入的需求。
- 海量数据存储:提供高效的数据存储和访问能力,适合海量数据场景。
- 高可用性与扩展性:具备良好的可扩展性和高可用性,适合快速发展的业务需求。
MongoDB基本操作示例
以下是一些常见的MongoDB操作命令示例:
数据库与集合操作
// 查看磁盘上的所有数据库
show dbs;
// 创建和使用数据库
use dbstudy;
// 删除数据库
db.dropDatabase();
// 创建集合
db.createCollection('student');
db.createCollection('teacher');
// 查看当前数据库中的集合
show collections;
// 删除集合
db.teacher.drop();
数据插入与查询
// 插入数据
db.student.insert({
sid: 16,
sname: 'yy',
age: 16,
ssex: '男'
});
// 查询所有数据
db.student.find();
// 根据条件查询
db.student.find({ sname: '李四' });
数据更新与删除
// 更新数据
db.student.update(
{ sname: '李四' },
{ $set: { age: 18 } },
{ multi: true } // 更新所有匹配的文档
);
// 删除数据
db.student.remove({ age: 22 }); // 删除所有符合条件的文档
Java操作MongoDB示例
在Java中,MongoDB的操作同样简单高效。以下是一些基本示例:
连接MongoDB
MongoClient mongoClient = new MongoClient("localhost", 27017);
MongoDatabase dbstudy = mongoClient.getDatabase("dbstudy");
MongoCollection<Document> student = dbstudy.getCollection("student");
新增数据
Teacher teacher = new Teacher();
teacher.setTsex("女");
teacher.setTbir("2000-8-7");
teacher.setTage(24);
teacher.setTname("夏目");
// Document document = new Document();
// document.append("tname",teacher.getTname());
// document.append("tsex",teacher.getTsex());
// document.append("tbir",teacher.getTbir());
// document.append("tage",teacher.getTage());
//创建gson对象
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
//将java对象转化为json字符串
String s = gson.toJson(teacher);
//将json字符串转化为Document对象
Document parse = Document.parse(s);
student.insertOne(parse);
查询数据
FindIterable<Document> findIterable = student.find();
for(Document doc:findIterable){
System.out.println(doc);
}
//条件查询
Bson eq = Filters.eq("tname", "老杨");
//模糊查询
Bson regex = Filters.regex("tname", "老"); //^老 开头 老$ 结尾
FindIterable<Document> findIterable = student.find(regex);
for (Document doc : findIterable) {
System.out.println(doc);
}
//分页
FindIterable<Document> documents = student.find().skip((1 - 1) * 3).limit(3);
for (Document doc : documents) {
System.out.println(doc);
}
//排序
FindIterable<Document> documents = student.find().sort(new Document("tage",1));
for (Document doc : documents) {
System.out.println(doc);
}
修改数据
// Bson b1 = Filters.eq("tname", "小小王");
Bson bson = Filters.or(
Filters.eq("tname", "老王"),
Filters.eq("tname", "小王")
);
Document document = new Document();
//累加
document.append("$inc", new Document("tage", 20));
// document.append("$set", new Document("tage", 24));
// UpdateResult updateResult = student.updateOne(bson, document);
UpdateResult updateResult = student.updateMany(bson, document);
long matchedCount = updateResult.getMatchedCount();
long modifiedCount = updateResult.getModifiedCount();
System.out.println(matchedCount );
System.out.println(modifiedCount );
}