因业务需要所以需要对mongoDB客户端jar包升级,在此记录一些过程
1、jar包替换,引入依赖
3.2.2: mongo-java-driver | 4.6.1: mongo-driver-sync<dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> <version>4.6.1</version> </dependency>2、创建mongoclient和数据库 1)连接设置 ①使用SCRAM-SHA-256或SCRAM-SHA-1的认证方式,其中SCRAM-SHA-256为默认的认证方式
MongoCredential credential = MongoCredential.createScramSha256Credential("<username>", "<authenticationDb>", "<password>");
MongoCredential credential = MongoCredential.createScramSha1Credential("<username>", "<authenticationDb>", "<password>");②创建客户端
MongoClientSettings settings = MongoClientSettings.builder() .applyToClusterSettings(new Block<ClusterSettings.Builder>() { @Override public void apply(ClusterSettings.Builder builder) { builder.hosts(seedList); } }) .applyToConnectionPoolSettings(new Block<ConnectionPoolSettings.Builder>() { @Override public void apply(ConnectionPoolSettings.Builder builder) { builder.maxSize(connectionPoolSize); } }) .credential(credential) .build(); MongoClient mongoClient = MongoClients.create(settings);③获取数据库和集合
MongoDatabase database = mongoClient.getDatabase("数据库名"); MongoCollection collection = database.getCollection("表名")备注:除了默认的BSON数据格式,还有一种就是使用pojo的数据格式,它可以直接将数据库中的文档转化为实体类而不用再额外增加实体类和文档的转换操作,下面是示例
CodecProvider pojoCodecProvider = PojoCodecProvider.builder().automatic(true).build(); CodecRegistry pojoCodecRegistry = fromRegistries(getDefaultCodecRegistry(), fromProviders(pojoCodecProvider)); 配置MongoClient,MongoDatabase或MongoCollection 实例以使用CodecRegistry。只需要配置其中之一 MongoDatabase database = mongoClient.getDatabase("库名").withCodecRegistry(pojoCodecRegistry);3、增删改查操作 1)查询操作
Document query = new Document("key","value"); collection.find(quert).first;//单个 ArrayList beans = new ArrayList(); FindIterable<Document> findIterable = collection.find(query);//多个,由游标遍历 if (limit > 0) { findIterable = findIterable.limit(limit); } if (skip > 0L) { findIterable = findIterable.skip((int)skip); } if (orderBy != null) { findIterable = findIterable.sort(orderBy); } MongoCursor<Document> cursor = findIterable.iterator(); while(cursor.hasNext()) { beans.add(this.toBean(cursor.next())); } //聚合操作单字段 Iterable<Document> resultIt=dbCollection.aggregate(Arrays.asList( Aggregates.match(query), Aggregates.group("$taskId", Accumulators.sum("sumMsgCount", "$msgCount")) ) ); //聚合操作单字段 Document groupId = new Document(); groupId.put("taskId", "$taskId"); groupId.put("platform", "$policy.platform"); groupId.put("appId", "$appId"); Iterable<Document> resultIt = dbCollection.aggregate(Arrays.asList( Aggregates.match(matchId), Aggregates.group(groupId, Accumulators.sum("msgCount", 1))));备注: ①与旧版本相比,4.6.1中以Document作为默认的类型参数,另外,组装过滤条件时,一种方式是通过new Document(),另外一种就是通过工具类,Filters和Updates类简化代码 ②查询条件是可以拼接的,如query.apend()或者query.put(),同时key可以设置为操作符做进一步过滤,value也可以为另一个Document对象,最终组装成一个Document对象作为Filter条件 ③查询还有一种聚合操作,可以通过Aggregates静态工具类组装聚合操作的过滤条件,上例所展示的分组方法前一个参数表示以taskId的值作为分组的id,不填时默认为“_id”,表示对集合中每一个文档计数,第二个参数为对文档中msgCount字段的值进行累加并将值赋予sumMsgCount字段进行展示 ④聚合操作如果需要展示多个字段进行分组,则可以将这多个字段转为集合处理 ⑤Accumulators是一个计算的工具类,包括累加,求平均值等方法,第一个参数为自定义展示的字段名,第二个参数为要处理的数据,如果为字段表示对该字段值进行计算,如果为常量按上面的例子来说就是每匹配一次对msgCount值进行加一 ⑥至于增删改操作添加过滤条件与查询操作相同 ⑦当mongoDB为集群状态时,因为每台机子上都会有数据的备份,因此尽管你只是删除一个或更新一个,也需要使用多数的方法
this.dbCollection.deleteMany(query); this.dbCollection.updateMany(query,update);标签:MongoDB,builder,findIterable,升级,new,query,Document,Aggregates From: https://www.cnblogs.com/nastynail/p/16938556.html