Springboot下的mongodb操作

Springboot中,本身JPA支持mongodb的,如MongoTemplate,但是需要其相关实体进行映射,如果文档嵌套较多,比较复杂的情况下,这种方式极其不实用,特别是在做一个mongodb数据库的查询统计的时候,因此推荐使用mongodb的java驱动MongoClient,直接来进行数据库的连接,然后进行数据的查询并返回结果。

驱动连接如下:

MongoClientURI uri = new MongoClientURI("mongodb://username:password@IP:27300/databasename");
        this.mongoClient = new MongoClient(uri);
        this.mongodb = mongoClient.getDatabase("database_name");

注意这里的连接要再使用完后进行关闭,比如在finalize()中释放,或者使用try(resource){}finally{}进行释放掉资源。

然后就是选择collection

mongodbService.getCollection(collectioin_name);

剩下的就是构建查询,查询也可以使用两种方式进行,比较简单的可以使用
com.mongodb.client.model.Filters和org.bson.conversions.Bson来进行构建,如:

Bson bson1 = Filters.eq("AAA", id);
Bson bson2 = Filters.eq("BBB", id);
Bson bson3 = Filters.eq("CCC", id);
Bson bson4 = Filters.eq("DDD", id);
Bson bson = Filters.or(bson1, bson2, bson3, bson4);
this.collection.find(bson);

但是对于比较复杂的查询或者聚合查询,这种方式就变的比较笨拙了。其实java调用mongodb的查询,无非就是调用相应的find,aggregate,然后传入相应的查询参数,其参数就是json,因此在java中只要构建出对应的json,然后传给调用的函数即可。

因此,我们还可以使用org.bson.Document的方式来进行传参数。比如在调用aggregate的时候,示例代码如下:

Document match = Document.parse("{$match:{$or:[{\"组织机构代码\":\"" + id + "\"}, {\"单位名称\":\"" + id + "\"}]}}");
Document unwind = Document.parse("{$unwind:\"$公司人员\"}");
Document group = Document.parse("{$group : {_id : \"$公司人员." + arrayFiled + "\", count : {$sum : 1}}}");

List<Document> conditions = new ArrayList<>();
conditions.add(match);
conditions.add(unwind);
conditions.add(group);

List<Document> result = new ArrayList<>();
AggregateIterable<Document> resultSet = this.collection.aggregate(conditions);
try (MongoCursor<Document> cursor = resultSet.iterator()) {
   while (cursor.hasNext()) {
      Document item_doc = cursor.next();
      result.add(item_doc);
   }
}

这里直接使用Document的parse,可以直接传入mongodb客户端的查询语句,极大方便了在写查询上的json查询语句。

:)

推荐阅读更多精彩内容