Java mongodb 简单帮助类

直接代码

package com.util;


import com.mongodb.*;
import com.mongodb.client.*;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Updates;
import com.mongodb.client.result.DeleteResult;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.springframework.beans.factory.annotation.Value;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;


/**
 * mongodb 工具类
 *
 * @author huxiaofei
 * @Version 1.0
 */
@Slf4j
public class MongodbUtil {


    @Value("${spring.data.mongodb.database}")
    private static String dbName;

    @Value("${spring.data.mongodb.collection}")
    private static String collectionName;


    /**
     * 创建集合
     *
     * @param client
     */
    public static void createCollection(final MongoClient client) {
        try {
            client.getDatabase(dbName).createCollection(collectionName);
        } catch (MongoCommandException e) {
            if (!e.getErrorCodeName().equals("NamespaceExists")) {
                throw e;
            }
        }
    }

    /**
     * 获取集合
     *
     * @param client
     * @return
     */

    public static MongoCollection<Document> getCollection(final MongoClient client) {
        return client.getDatabase(dbName).getCollection(collectionName);
    }


    /**
     * 事务操作
     *
     * @param client
     * @param document 需要传的具体参数
     */

    public static void mongoTransaction(final MongoClient client, Document document) {

        TransactionOptions txnOptions = TransactionOptions.builder()
                .readPreference(ReadPreference.primary())
                .readConcern(ReadConcern.MAJORITY)
                .writeConcern(WriteConcern.MAJORITY)
                .build();

        //事务逻辑
        try (ClientSession clientSession = client.startSession()) {
            clientSession.withTransaction(
                    () -> {
                        // 获取数据库
                        MongoDatabase db = client.getDatabase(dbName);
                        MongoCollection<Document> collection = db.getCollection(collectionName);
                        //插入单条数据
                        collection.insertOne(clientSession, document);
                        return null;
                    },
                    txnOptions
            );

        } catch (MongoException e) {
            log.error("Transaction aborted. Caught exception during transaction.");
            throw e;
        }
    }


    /**
     * 事务操作插入多条数据
     *
     * @param client
     * @param document
     */
    public static boolean mongoInsertManyTransaction(final MongoClient client, List<Document> document) {

        TransactionOptions txnOptions = TransactionOptions.builder()
                .readPreference(ReadPreference.primary())
                .readConcern(ReadConcern.MAJORITY)
                .writeConcern(WriteConcern.MAJORITY)
                .build();

        // 事务逻辑
        try (ClientSession clientSession = client.startSession()) {
            clientSession.withTransaction(
                    () -> {
                        // 获取数据库
                        MongoDatabase db = client.getDatabase(dbName);
                        MongoCollection<Document> collection = db.getCollection(collectionName);
                        //插入多条文档数据
                        collection.insertMany(clientSession, document);
                        return true;
                    },
                    txnOptions
            );
        }
        return false;
    }


    /**
     * 根据条件查询
     *
     * @param client
     * @param conditions map类型
     * @return
     */

    public static List<Document> findDocuments(final MongoClient client, Map<String, Object> conditions) {
        Document query = new Document();

        // 拼接查询条件
        for (Map.Entry<String, Object> entry : conditions.entrySet()) {
            String key = entry.getKey();
            Object value = entry.getValue();
            query.append(key, value);
        }
        return getCollection(client).find(query).into(new ArrayList<>());
    }


    /**
     * 多条件查询
     *
     * @param client
     * @param conditions Filters.eq("name", "John Doe"),
     *                   Filters.gt("age", 25)
     * @return
     */

    public static List<Document> findDocumentsWithMultipleConditions(final MongoClient client, Bson... conditions) {
        MongoCollection<Document> collection = getCollection(client);
        Bson queryCondition = Filters.and(conditions); // 组合多个查询条件
        List<Document> results = new ArrayList<>();
        collection.find(queryCondition).iterator().forEachRemaining(results::add);
        return results;
    }


    /**
     * 根据条件批量更新
     *
     * @param client
     * @param filterMap
     * @param updateMap
     */

    public static void updateDocuments(final MongoClient client, Map<String, Object> filterMap, Map<String, Object> updateMap) {
        MongoCollection<Document> collection = getCollection(client);

        // 构建过滤条件
        List<Bson> filters = new ArrayList<>();
        for (Map.Entry<String, Object> entry : filterMap.entrySet()) {
            filters.add(Filters.eq(entry.getKey(), entry.getValue()));
        }

        // 构建更新操作
        List<Bson> updates = new ArrayList<>();
        for (Map.Entry<String, Object> entry : updateMap.entrySet()) {
            updates.add(Updates.set(entry.getKey(), entry.getValue()));
        }

        // 应用过滤条件和更新操作
        Bson filter = Filters.and(filters);
        Bson update = Updates.combine(updates);

        // 执行更新操作
        collection.updateMany(filter, update);
    }


    /**
     * 根据条件删除
     *
     * @param client
     * @param filterMap 删除条件
     */
    public static void deleteDocumentsByCondition(final MongoClient client, Map<String, Object> filterMap) {
        MongoCollection<Document> collection = getCollection(client);
        // 构建过滤条件
        List<Bson> filters = new ArrayList<>();
        for (Map.Entry<String, Object> entry : filterMap.entrySet()) {
            filters.add(Filters.eq(entry.getKey(), entry.getValue()));
        }

        // 删除条件
        Bson filter = Filters.and(filters);
        // 批量删除
        DeleteResult deleteResult = collection.deleteMany(filter);
        log.info("Deleted " + deleteResult.getDeletedCount() + " documents");
    }


    /**
     * 普通插入一条数据
     *
     * @param client
     * @param document
     */
    public static void insertDocument(final MongoClient client, Document document) {
        client.getDatabase(dbName).getCollection(collectionName).insertOne(document);
    }

    /**
     * 递归查询
     * children 方式
     *
     * @param collection
     * @param parentNode
     */
    public static void performRecursiveQuery(MongoCollection<Document> collection, Document parentNode) {
        if (parentNode != null) {
            log.info("Parent Node: " + parentNode);

            // Get children nodes and recursively query each child
            if (parentNode.containsKey("children")) {
                for (String childId : (List<String>) parentNode.get("children")) {
                    // 查询出符合条件的
                    Document childNode = findNodeById(collection, childId);
                    performRecursiveQuery(collection, childNode);
                }
            }
        }
    }

    /**
     * 根据_id查询一条数据
     *
     * @param collection
     * @param nodeId
     * @return
     */

    public static Document findNodeById(MongoCollection<Document> collection, String nodeId) {
        return collection.find(new Document("_id", nodeId)).first();
    }


    /**
     * 自旋重试提交
     *
     * @param clientSession
     */
    private void commitWithRetry(final ClientSession clientSession) {
        while (true) {
            try {
                clientSession.commitTransaction();
                break;
            } catch (MongoException e) {
                // can retry commit
                if (e.hasErrorLabel(MongoException.UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL)) {
                    log.info("UnknownTransactionCommitResult, retrying commit operation ...");
                } else {
                    log.error("Exception during commit ...");
                    throw e;
                }
            }
        }
    }

}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容