java支持
连接数据库
MongoClient client = new MongoClient(host,port);//localhost,27017(默认)
MongoDatabase database = client.getDatabase(database_name);//获取数据(数据库名)
获取集合
MongoCollection<Document> collection = database.getCollection(name);//没有则会创建
数据库的操作
插入数据
java
Document document = new Document();
document.append("NAME","veng");
document.append("AGE",21);
collection.insertOne(document);//插入一条数据
//插入多条
List<Document> list = new ArrayList<>();
collection.insertMany(list);
shell:
>db.col.insert({title: 'MongoDB 教程',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
查询数据
java
MongdbJDBC mongdbJDBC = new MongdbJDBC();
MongoCollection<Document> collection = mongdbJDBC.getCollection("student");
FindIterable<Document> documents = collection.find();//所有的
//条件查询
BasicDBObject query = new BasicDBObject("NAME", "VENG");
documents = collection.find(query);//插叙NAME=VENG的数据
//去重查询
DistinctIterable<String> cid = collection.distinct("NAME", String.class); //需要去重的字段,字段的类型
shell:
> db.col.find({"NAME":"VENG", "AGE":21}).pretty()
更新数据
java
BasicDBObject parse = BasicDBObject.parse("{'NAME':'VENG'}");
BasicDBObject update = new BasicDBObject("$set", new BasicDBObject("AGE", 25));
collection.updateMany(parse, update);//更新所有符合条件的
collection.updateOne(parse,update);//更新第一条
shell
>db.col.update({'NAME':'VENG'},{$set:{'AGE':25}})
分组聚合 – aggregte()
通过 “$group”,来进行分组;
例如:
collection结构:(记录学生成绩)
分组执行:sql 语句
db.getCollection('student_course').aggregate([{$group:{_id:"$SID"}}])
按学号分组,重新给分组的字段起名,_id 一定要有
执行结果:
对组内,也可以进行计算(最大值,最小值,平均值等等)
表达式 | 描述 |
$sum | 计算总和。 |
$avg | 计算平均值 |
$min | 获取集合中所有文档对应值得最小值。 |
$max | 获取集合中所有文档对应值得最大值。 |
$push | 在结果文档中插入值到一个数组中。 |
$addToSet | 在结果文档中插入值到一个数组中,但不创建副本。 |
$first | 根据资源文档的排序获取第一个文档数据。 |
$last | 根据资源文档的排序获取最后一个文档数据 |
例如:求上面的学生的平均成绩
db.getCollection('student_course').aggregate([{$group:{_id:"$SID",avg:{$avg:"$SCORE"}}}])
执行结果:
还有一些聚合框架中常用的几个操作:
- $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
- match使用MongoDB的标准查询操作。
- $limit:用来限制MongoDB聚合管道返回的文档数。
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
- $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
- $group:将集合中的文档分组,可用于统计结果。
- $sort:将输入文档排序后输出。
- $geoNear:输出接近某一地理位置的有序文档。
例如:求平均成绩前10的学生
db.getCollection('student_course').aggregate([{$group:{_id:"$SID",avg:{$avg:"$SCORE"}}},{$limit:10},{$sort:{"avg":-1}}])
$sort 1 升序,-1降序
执行结果:
java操作
求平均成绩前10的学生:
public List<Student> findAvgScore(int limit,boolean sort) {
int sort_int = 1;
if (!sort){
sort_int = -1;
}
ArrayList<Student> students = new ArrayList<>();
Document sub_group = new Document();
sub_group.append("_id","$SID");
sub_group.append("avg",new Document("$avg","$SCORE"));
Document group = new Document("$group",sub_group);
Document limit_doument = new Document("$limit", limit);
Document sort_document = new Document("$sort", new Document("avg", sort_int));
ArrayList<Document> documents = new ArrayList<>();
documents.add(group);
documents.add(limit_doument);
documents.add(sort_document);
AggregateIterable<Document> aggregate = collection.aggregate(documents);
for (Document document : aggregate) {
Student student = new Student();
String id_string = document.get("_id").toString();
long sid = Long.parseLong(id_string);
student.setId(sid);
students.add(student);
}
return students;
}
分析:即上面sql查询中的每个{}代表一个Document,对应上去就行。